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