2014-09-21 66 views
0

在下面的代码snippet同步上的其他对象在Java

public class MsLunch { 
    private long c1 = 0; 
    private long c2 = 0; 
    private Object lock1 = new Object(); 
    // private Object lock2 = new Object(); 
private Dummy lock2 = new Dummy(); 
    public void inc1() { 
     synchronized(lock1) { 
      c1++; 
     } 
    } 

    public void inc2() { 
     synchronized(lock2) { 
      c2++; 
     } 
    } 
} 

我已经改变用来保护C2计数的锁定对象。我使用了一个虚拟类,它与MsLunch类没有关系。是好的,或者我应该总是把锁放在当前类的对象上(“this”或MsLunch对象或父类Object)。 请回答,因为我一直在努力理解用于同步块的对象的作用。 同步块成员字段和变量必须由用于锁定的对象持有吗?

+0

另外,在使用单个对象的实例方法多种锁对象可以使僵局更容易。 – 2014-09-21 20:42:17

回答

0

无论哪种方式都很好。有设计理由使用你的对象作为锁,并且有设计理由让你的锁保持私密。

我会做的唯一的批评就是Object通常被用作Java中的锁,你不必发明一个虚拟类。

public class MsLunch { 
    private long c1 = 0; 
    private long c2 = 0; 
    private final Object lock1 = new Object(); 
    private final Object lock2 = new Object(); 

    public void inc1() { 
     synchronized(lock1) { 
      c1++; 
     } 
    } 

    public void inc2() { 
     synchronized(lock2) { 
      c2++; 
     } 
    } 
}