请问;
public synchronized void increment()
{
  lock.lock();
  try
  {
    p.incrementX();
  }
  finally
  {
    lock.unlock();
  }
}
请问:
synchronized不是已经声明increment()方法为同步的吗 怎么还要用lock.lock();呢 这不是重复了吗
请帮忙详细解答一下
谢谢

解决方案 »

  1.   

    而 public synchronized void increment() 是方法的同步.
    lock 是对象的锁.
    假设两个线程.通过不同的锁来访问同步方法.
    那么同步方法是可以执行的.
    同步方法默认情况下是用 this 作为他的锁.
    所以在这种情况下 lock () 是没有必要的.
    但是 你的程序中 有一个lock 对象 想必你 lock 应该
    是你前面代码中某个类的对象.
    这是 你用 lock 来做为锁的话 
    我可以 
    Lock lock1  = new  Lock();
    Lock lock2= new Lock();
    那么我用lock1 和 lock2 作为锁的话
    那么你的同步方法就无法保证我的对象是同一个对象.
    所以就必须把你的当前同步的对象锁定.
    也就是 lock 方法同步的时候一定要注意保证锁的唯一性.
      

  2.   

    答:这段代码表示:p.incrementX(); 这个方法调用必须要“同时”拥有两把锁才能执行:一把是:this这个对象的锁,另一把是lock这个对象的锁(因为我“猜测”:lock.lock()方法很可能是对lock对象加锁)。
    以上仅供你参考
      

  3.   

    加上LOCK,,是为了解决同步时候,,相同优先级别的线程对资源的索取,,而造成死锁现象...
      

  4.   

    synchronized 保证了其它线程不会在这个方法完成前,使用这个方法,也就是独享这个方法,直到完成lock你这个方法可能需要某个锁,来保证某些资源不会出现死锁。
    比如,你需要A,B2个锁,而,A此时在另一个线程被占用了,你则只能等待了。直到另一个线程释放了A锁!