【问题标题】:Synchronizing on other objects in java [duplicate]在java中同步其他对象[重复]
【发布时间】:2014-11-15 18:51:23
【问题描述】:

在下面的代码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 对象或父类对象)。 请回答,因为我一直在努力理解同步块中使用的对象的作用。 同步块成员字段和变量是否必须由用于锁定的对象持有?

【问题讨论】:

  • 还要注意,在单个对象的实例方法中使用多个锁对象可以使死锁更容易。

标签: java multithreading synchronized


【解决方案1】:

无论哪种方式都可以。将您的对象用作锁是有设计原因的,并且像您所做的那样将锁保持私有是有设计原因的。

我要提出的唯一批评是 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++;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多