java - 我应该在 Java 中使用什么作为同步语句的锁定对象

标签 java object synchronization

谁能解释一下这些例子之间的区别是什么?

示例 # 1.

public class Main {

    private Object lock = new Object();
    private MyClass myClass = new MyClass();

    public void testMethod() {
        // TODO Auto-generated method stub
        synchronized (myClass) {
            // TODO: modify myClass variable
        }
    }

}

示例 # 2.

package com.test;

public class Main {

    private MyClass myClass = new MyClass();
    private Object lock = new Object();

    public void testMethod() {
        // TODO Auto-generated method stub

        synchronized (lock) {
            // TODO: modify myClass variable
        }
    }

}

如果在修改变量时需要注意同步,应该用什么作为监视器锁呢?

最佳答案

假设 Main 不是一个“有漏洞的抽象”,这里是第一个和第二个示例之间的最小差异。

使用 Object 可能比其他类更好,因为 Object 实例没有字段,因此更小。 Object-as-lock 惯用语清楚地表明 lock 变量仅用作锁。

话虽如此,锁定一个其他任何东西都看不到的对象绝对有优势。 Main 方法在 Main(例如 this)上同步的问题在于,其他不相关的代码也可能出于不相关的目的在其上同步.通过同步专用(私有(private))锁对象,您可以避免这种可能性。


回应评论:

There is a MAJOR difference in the two cases. In the first you're locking the object that you want to manipulate. In the second you're locking some other object that has no obvious relationship to the object being manipulated. And the second case takes more space, since you must allocate the (otherwise unused) Object, rather than using the already-existing instance you're protecting.

我认为您做出了错误的假设 - MyClass 是需要保护的数据结构。事实上,问题并没有这么说。实际上,该示例的编写方式暗示该锁旨在保护整个 Main 类……而不仅仅是其状态的一部分。在这种情况下,存在明显的联系......

唯一最好锁定 MyClass 的情况是 Main 是一个允许其他代码获取其 的泄漏抽象我的类引用。那将是糟糕的设计,尤其是在多线程应用程序中。

根据修订历史,我很确定这不是 OP 的意图。

关于java - 我应该在 Java 中使用什么作为同步语句的锁定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735500/

相关文章:

java - 如果监视器已经锁定,那么在java中对同步块(synchronized block)的请求会发生什么?

wpf - 将模型的变化列表同步到 ViewModel 的 ObservableList 的最佳实践?

c - Pthread_join() 在 C 中返回不正确的值

java - 如何在同一个 `groupingBy` 中处理 `stream()` 的结果 List<T> 值?

Java (Swing) - 如何旋转一堆线?

java - Android 中的 BitmapFactory null 问题

javascript - 在不覆盖现有键值的情况下将对象的值添加到对象数组

java - 在Java中获取两个不同字符串之间的共同值

java - 如何在Java中导出高分辨率图像

python - 如何根据对象属性对对象列表进行切片