A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-6-19 14:29  /  1603 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙胜录 于 2012-6-19 15:54 编辑

首先看下代码
class Ticket implements Runnable
{

int  tickets = 1000;

Object object = new Object();

public void run()
{

  while (true)
  {
   synchronized (new Object())//不会同步
   {
    if (tickets > 0)
    {
     try
     {
      Thread.sleep(10);
     }
     catch (InterruptedException e)
     {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     
     System.out.println(Thread.currentThread().getName() + "saling....." + tickets--);
    }
   }
   
  }
}
}
public class TicketDemo
{

public static void main(String[] args)
{

  Ticket t = new Ticket();
  Thread t1 = new Thread(t);
  Thread t2 = new Thread(t);
  Thread t3 = new Thread(t);
  Thread t4 = new Thread(t);
  t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}
在同步代码块synchronized ()中放入对象object时可以同步,为什么放入new Object()匿名对象时不能起到同步的作用?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
不同线程启动调用run函数时,执行synchronized (new Object())语句时,锁住的是各自new出来的Object对象。不是同一个对象,所以能起到同步的作。
而用object时
Ticket t = new Ticket(); 只实例化一个Ticket类。
  Thread t1 = new Thread(t);
  Thread t2 = new Thread(t);
  Thread t3 = new Thread(t);
  Thread t4 = new Thread(t);
synchronized (object)要锁的是同一个对象,所以起到同步的作用

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
很简单 每次执行到synchronized(new Object())时,你都创建一个新的对象,每次都是对新的对象上锁,不会影响到其他线程,如果你要是想同步的话,你可以这样synchronized(this)表示对当前对象上锁,当然也可以这样synchronized(Ticket.class)表示对这个类上锁。总之 synchronized()括号里是你要锁住的对象。之所以出现线程安全问题就是因为多个线程共享一个数据,所以你要把这一个数据锁上,而不是每次锁的时候都去锁一个不相干的新的数据,这和没有synchronized一样,根本没气到作用

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java对于多线程的安全问题提供了专业的解决方式.
就是同步代码块.
synchronized(对象)
{
    需要被同步的代码
}
对象如同锁,持有锁的线程可以在同步中执行.
没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁.
如果楼主将对象带入为object,那么代码的执行是同一个锁,所以可以同步.
但是如果是new object()就不是一个对象了.不是同一个锁,所以不可以同步.
回复 使用道具 举报
同步必须是多个线程使用同一个锁,new Object()使得多个线程使用了多个锁
回复 使用道具 举报
synchronized(object),括号里面表示的是同步锁,必须锁是一样才可以进行多线程同步

例如:object就相当于锁的钥匙,必须是匹配这个锁的钥匙才能打开,也就是同步,而new Objiect()每次new都相当于去买了一把新锁,而对应的钥匙自然也就不一样
那么多线程自然也就是因为钥匙的不匹配而达不到同步的效果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马