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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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();

}
}

5 个回复

正序浏览
唐辉辉 发表于 2012-6-4 09:15
并没有报错!
但不建议这样使用。
对象应该为一个固定的对象,这里的对象其实是一把锁。如果你用new Object ...

我专门放的完整代码,你复制在Myeclipse运行就知道有错了
回复 使用道具 举报
理论上不会报错,但new一个Object()为对象相当没加锁
回复 使用道具 举报
本帖最后由 袁錦泰 于 2012-6-4 10:22 编辑
陆建平 发表于 2012-6-4 09:13
synchronized  需要锁,这个锁可以是任意对象。 String str  = new String("");  就创建了一个String对象st ...

李项京写的时候可没有写那么简单,下次借鉴发地址就可以了,别只复制一部分,而且你的答案和问题是两个意思.
回复 使用道具 举报
并没有报错!
但不建议这样使用。
对象应该为一个固定的对象,这里的对象其实是一把锁。如果你用new Object(); 产生的不是一个固定的对象。
回复 使用道具 举报
本帖最后由 陆建平 于 2012-6-4 09:18 编辑

synchronized  需要锁,这个锁可以是任意对象。 String str  = new String("");  就创建了一个String对象str作为线程同步的锁。关于参数问题:毕老师在他的视频用到的代码是synchronized (obj),synchronized (this),synchronized (Ticket.class),意思是保证参数的唯一性,才能保证锁的唯一性,才能保证线程的安全
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马