public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();
 
    public void inc1() {
        synchronized(lock1) {
            c1++;
        }
    }
 
    public void inc2() {
        synchronized(lock2) {
            c2++;
        }
    }
}如下把方法同步起来public class MsLunch {
    private long c1 = 0;
    private long c2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();
 
    synchronized public void inc1() {
        
            c1++;
        }
    
 
    synchronized public void inc2() {
        
            c2++;
        
    }
}

解决方案 »

  1.   

    上面一个程序是分别以lock1和lock2作为锁,下面一个程序两个方法都是以当前对象本身为锁!
      

  2.   

    区别还是很大的,我第一眼就看出来了,写法不一样。
    再回忆了一下,好像一个是同步块(第一个),另一个是同步方法。
    第一段上当多个线程运行到这个方法里面,是通过看lock对象是否加锁,
    第二段上当要执行这个方法时,检查的是这个方法上是否加锁。
    奶奶的不知道怎么才说得清这个问题。好像记得说第一段这种写法好像可以隐式调用其他同步方法,不用等锁释放,学过就没用过这鬼东西
      

  3.   

    如果没有synchronized(lock2)原型的话哪么第一种形式是错误的,因为在方法内部是不能定义方法的。