在java中同步其他对象

时间:2014-09-21 20:06:16

标签: java multithreading synchronized

在下面的代码snippet

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类无关。它是好还是我总是把锁放在当前类的对象(“t​​his”或MsLunch对象或父类Object)上。 请回答,因为我一直在努力了解同步块中使用的对象的作用。 同步块成员字段和变量是否必须由用于锁定的对象保持?

1 个答案:

答案 0 :(得分: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++;
        }
    }
}