java - 同步对象并更改其字段之一

标签 java multithreading synchronization locking

我试图理解涉及对象同步的代码部分,并且其中一个同步块(synchronized block)更改了对象的某些字段。我正在查看的代码类似于以下内容:

public class ClassA {
    private ClassB someObject = new ClassB();

    public void FuncA() {
        synchronized(someObject) {
            //change some field of someObject
        }
    }

    public void FuncB() {
        synchronized(someObject) {
            //change some field of someObject
        }
    }
}

这是一种安全的做法吗?我在网上阅读了一些描述锁安全实践的页面,但似乎没有一个涉及类似的示例。

感谢任何帮助。谢谢!

最佳答案

是的,没问题。

例如,这基本上就是您在从多个线程写入 ArrayList 时可以执行的操作:在列表上同步,并更新其字段(内部数组、大小等)。

需要注意的是,您不得在任何地方以非同步方式访问 someObject

public class ClassA {
    private ClassB someObject = new ClassB();

    public void FuncA() {
        synchronized(someObject) {
            //change some field of someObject
        }
    }

    // ...

    // BAD! Don't do this.
    public void FuncC() {
        // read some field of someObject
    }
}

关于java - 同步对象并更改其字段之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52271579/

相关文章:

java - 如果没有 EventQueue 的 invokeLater,第一个 UserTypedString 不会在 keyTyped (keyListener) 中被识别

java - 多主机的数据库处理

java - 无法将字符串转换为 long(timestamp) 或 long 转换为字符串

java - 将 arraylist 中的每个值显示到每个 textView Android

java - 无法编译 Parquet 工具

java - 在 .property 中存储日期并与当前日期进行比较

com - 为什么CoRegisterClassObject创建两个额外的线程?

c++ - C/C++:宽松的 std::atomic<bool> 与 X64 架构上的解锁 bool

java - 局部变量同步

c# - 从子进程的标准输出同步异步读取