黑马程序员技术交流社区

标题: 多线程中同步代码块 synchronized()中传递的对象问题 [打印本页]

作者: 孙峰    时间: 2012-6-4 09:10
标题: 多线程中同步代码块 synchronized()中传递的对象问题
class Bank
{
private int sum;

public void add(int n)  
     {
    synchronized (new Object())   //  同步代码块中此处要求传递一个对象。老毕是在此类中“Object obj=new Object()”,然后将“obj”传递,
      {                                              //为啥我放“new Object()”,却出现错误呢?
  sum=sum+n;
  try{Thread.sleep(10);}catch(Exception e){}
System.out.println(" sum=  "+sum);
  }
    }
}
class Cus implements Runnable
{
private Bank b=new Bank();
public void run()
{
  for(int x=0;x<3;x++)
  {
   b.add(100);
  }
}
}


class BankDemo
{
public static void main(String[] args)
{
  Cus c=new Cus();
  Thread t1=new Thread(c);
  Thread t2=new Thread(c);
  
  t1.start();
  t2.start();

}
}


作者: 陆建平    时间: 2012-6-4 09:13
本帖最后由 陆建平 于 2012-6-4 09:18 编辑

synchronized  需要锁,这个锁可以是任意对象。 String str  = new String("");  就创建了一个String对象str作为线程同步的锁。关于参数问题:毕老师在他的视频用到的代码是synchronized (obj),synchronized (this),synchronized (Ticket.class),意思是保证参数的唯一性,才能保证锁的唯一性,才能保证线程的安全

作者: 唐辉辉    时间: 2012-6-4 09:15
并没有报错!
但不建议这样使用。
对象应该为一个固定的对象,这里的对象其实是一把锁。如果你用new Object(); 产生的不是一个固定的对象。
作者: 袁錦泰    时间: 2012-6-4 10:20
本帖最后由 袁錦泰 于 2012-6-4 10:22 编辑
陆建平 发表于 2012-6-4 09:13
synchronized  需要锁,这个锁可以是任意对象。 String str  = new String("");  就创建了一个String对象st ...

李项京写的时候可没有写那么简单,下次借鉴发地址就可以了,别只复制一部分,而且你的答案和问题是两个意思.
作者: 何旭栋    时间: 2012-6-4 10:30
理论上不会报错,但new一个Object()为对象相当没加锁
作者: 孙峰    时间: 2012-6-4 11:25
唐辉辉 发表于 2012-6-4 09:15
并没有报错!
但不建议这样使用。
对象应该为一个固定的对象,这里的对象其实是一把锁。如果你用new Object ...

我专门放的完整代码,你复制在Myeclipse运行就知道有错了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2