Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中的其他对象上同步_Java_Multithreading_Synchronized - Fatal编程技术网

在java中的其他对象上同步

在java中的其他对象上同步,java,multithreading,synchronized,Java,Multithreading,Synchronized,在下面的代码中 我已经更改了用于保护c2计数的锁对象。我使用了一个虚拟类,它与MS午餐类无关。这样可以吗?还是应该始终锁定当前类的对象this或ms午餐对象或父类对象。 请回答,因为我一直在努力理解同步块中使用的对象的角色。 同步块成员字段和变量必须由用于锁定的对象保存吗?任何一种方式都可以。使用对象作为锁有设计原因,也有设计原因使锁保持私有 我唯一的批评是对象在Java中通常被用作锁,您不必发明一个伪类 public class MsLunch { private long c1 =

在下面的代码中

我已经更改了用于保护c2计数的锁对象。我使用了一个虚拟类,它与MS午餐类无关。这样可以吗?还是应该始终锁定当前类的对象this或ms午餐对象或父类对象。 请回答,因为我一直在努力理解同步块中使用的对象的角色。
同步块成员字段和变量必须由用于锁定的对象保存吗?

任何一种方式都可以。使用对象作为锁有设计原因,也有设计原因使锁保持私有

我唯一的批评是对象在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++;
        }
    }
}

还要注意,在单个对象的实例方法中使用多个锁对象可以使死锁更容易。
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++;
        }
    }
}