ClassA里有这样的代码段a:
synchronized(this){
if(count == 0){
wait();
}}有一个publice方法为addCount().然后ClassA的一个实例是 AInstance,
我想问下,在线程X在count == 0的条件下执行了代码段a之后,整个ClassA都被同步锁锁定了。那么在线程Y中调用AInstance.addCount()应该不能执行才对啊,可是程度为什么还是会执行呢?难道同步锁只能锁同一个线程里的,对不同的线程没有同步锁锁定的功能???这不合理吧?

解决方案 »

  1.   

    synchronized只锁带synchronized,不带synchronized方法任何时候都可以执行。所以,要给addCount加锁才行。
      

  2.   

    现在又想了想,是不是代码段a中wait()一执行完,synchronized中的语句都也就执行完了,所以释放了同步锁。所以又可执行addCount()了??????
      

  3.   


    只锁带synchronized,是的。我需要请教大家的是:
    synchronized(this){}锁定的是this吧???
    然后我就想既然是this就是整个ClassA啊,所以也就不能执行ClassA中的方法addCount()。要不,synchronized锁的内容到底是什么呢??
      

  4.   

    答:线程X在count == 0时执行wait()时,线程X已释放了对象的锁,同时线程X被放到那个this对象的wait等待队列中睡眠了[不是表示:wait()已执行执行完]。因此:线程Y才有可能去执行同一个对象this上的另一个synchronized方法addCount()。
    比如:若线程X不是执行的是wait(),而是sleep(),那就惨了,这时线程Y不可能去执行同一个对象this上的另一个synchronized方法addCount()。
      

  5.   


    云上飞翔的意思是:
    wait()可以让线程X释放对象的锁,所以可以让线程Y继续对该this对象上进行操作。
    而sleep()是不释放对象锁的,线程Y无法对该this对象进行操作。是吗?????
    这是wait()和sleep()的差别吗?
      

  6.   

    锁住的都是同样带synchronized的代码,
    我不知道这样说你能不能理解?synchronized是一种共享约定,只有遵循这个约定的才可以做到同步,
    打个比方:只有剃度出家的和尚才要戒酒,而俗人是不受这个约定的。
    所以,并不是说你锁定了少林寺,就不允许所有到少林寺的人吃肉喝酒了。
      

  7.   

    不好意思,引用错误,jinxfei 的比喻太搞了