java - 锁对象应该是易变的(同步块(synchronized block),类的多个实例)?

标签 java multithreading synchronization synchronized

我从类 A 创建了三个对象。所有这三个对象都可以更新存储在类 A 中的私有(private)静态 volatile 变量中的值。更新此变量是在具有特定条件的同步块(synchronized block)内完成的。我想通过使用锁对象来同步块(synchronized block)。

所以首先在 MainClass 中创建对象

A a1 = new A();
A a2 = new A();
A a3 = new A();

在此之后,对象开始过自己的生活。这是我的 A 类的一个简化示例。

public class A{
    private static volatile String sharedVariable;
    Object lockObject = new Object();

    private void updateVariable(String newValue){
        //... some code
        synchronized(lockObject){
            //... code to check whether to update the value
            sharedVariable = newValue;
        }
    }

如果我希望同步块(synchronized block)与类 A 的所有实例和所有线程同步,我应该将 lockObject 声明为 private static volatile 吗?如果我使用类(this)来同步块(synchronized block),它会完成同样的事情吗?

我认为使用上面的代码,类 A 的所有实例都创建了自己的 lockObject 并与之同步。因此,同步只会发生在每个实例(a1、a2 和 a3)中的线程中。这是正确的吗?

最佳答案

volatile 提供的是一种先发生后发生的保证,即所有线程中的后续读取将看到最近写入的值。

此处不混淆 volatile 和 static 的用途。

如果您将锁对象定义为实例变量,那么它会为 A 的每个实例创建,这绝对不是我们想要的。

由于需要同步访问的对象是静态的,所以需要创建一个static final 锁对象。 final(虽然不是必需的,但这是一个很好的做法)确保锁对象可见并且在运行时不会更改,并且静态创建一个锁来访问对象

public class A{
    private static volatile String sharedVariable;
    private static final Object lockObject = new Object();

    private void updateVariable(String newValue){
        //... some code
        synchronized(lockObject){
            //... code to check whether to update the value
            sharedVariable = newValue;
        }
    }

更多相关信息:

关于java - 锁对象应该是易变的(同步块(synchronized block),类的多个实例)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414777/

相关文章:

java - 调整组合框弹出窗口的大小

java - 如何将值推送到 Cloud Firestore 文档中的数组字段?

java - 如何从二叉搜索树按字母顺序打印?

c - 进程结束/死亡时共享 POSIX 对象清理

c++ - 乱序执行的获取-释放对

java - JXDatePicker 返回错误的日期

c++ - 如何在不使用全局变量的情况下通知主线程状态的外部线程?

c++ - 线程的模式来检查它是否应该停止?

c++ - 使用覆盖 operator-> 的代理同步对象

java - 如何获取主文件夹的文件和子文件夹的更改?