java - 在 "this"或 Java 中的私有(private)对象上同步?

标签 java multithreading synchronization

<分区>

Possible Duplicate:
Avoid synchronized(this) in Java?

这两段代码有什么区别?各有什么优缺点?

1)

public class Example {
    private int value = 0;

    public int getNextValue() {
        synchronized (this) {
            return value++;
        }
    }
}

2)

public class Example {
    private final Object lock = new Object();
    private int value = 0;

    public int getNextValue() {
        synchronized (lock) {
            return value++;
        }
    }
}

最佳答案

我选择第二种方法的主要原因是我无法控制客户端对我的类实例执行的操作。

如果出于某种原因,有人决定使用我的类的实例作为锁,他们将干扰我的类中的同步逻辑:

class ClientCode {
    Example exampleInstance;

    void someMethod() {
        synchronized (exampleInstance) {
            //...
        }
    }
}

如果在我的 Example 类中,我使用了一个其他人看不到的锁,他们就不会干扰我的逻辑,也不会像上面的场景那样引入任意互斥量。

综上所述,这只是信息隐藏原理的一种应用。

关于java - 在 "this"或 Java 中的私有(private)对象上同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11167566/

相关文章:

java - 无法找到类型 : io. vertx.core.http.HttpServerRequesta 的上下文数据

c++ - 在线程应用程序中从 QtScript 调用的 Qt 槽

ios - Realm 对象服务器 - 何时进行同步?

Javascript函数执行同步

c# - 将记录插入到 SQL Server CE 数据库移动到另一个线程? C# Compact Framework 3.5

git - Subgit - 停止属性同步

java - Android 在 "<"上编辑文本时按键监听器?

java - 如何有效地找到单个像素值随时间变化的标准偏差? (来自视频源)

java - 右对齐我的观点

c++ - 从父线程继承全局值