gpt4 book ai didi

java - Java中对象的初始化是线程安全的吗

转载 作者:行者123 更新时间:2023-12-01 06:38:44 24 4
gpt4 key购买 nike

我在我的一个应用程序中编写了与此类似的代码,但我不确定它是否是线程安全的。

public class MyClass {
private MyObject myObject = new MyObject();

public void setObject(MyObject o) {
myObject = o;
}

public MyObject getObject() {
return myObject;
}
}

setObject()getObject() 方法将由不同的线程调用。 getObject() 方法将由不断在 Canvas 上绘图的线程调用。为了获得最佳 FPS 和平滑运动,我不希望该线程一直等待同步锁。因此,除非确实有必要,否则我想避免使用同步。那么这里真的有必要吗?或者还有其他更好的方法来解决这个问题吗?

顺便说一句,线程是否收到对象的旧副本并不重要。

最佳答案

就你当前版本的状态而言,它绝对不是线程安全的,因为myObject的并发访问会建立数据竞争。

您没有指定这一点,但如果 MyObject 本身不是线程安全的,那么无论您对所显示的代码执行什么操作,您的程序都将不是线程安全的。

it doesn't matter if the thread receives an older copy of the object.

Java 内存模型允许通过数据竞争访问的对象发生比这更糟糕的事情:

  • 线程可能总是接收相同的对象(它碰巧读取的第一个对象);
  • 线程可能会观察到仅初始化了部分可达值的对象(一个撕裂对象)。

For optimum FPS and smooth motion, I don't want that thread to be kept waiting for a synchronization lock.

您是否花费了精力来实际测量线程等待锁的时间?我的猜测:你没有这样做,因为时间太短以至于无法察觉。

但是,您的情况甚至不需要锁:只需使实例变量 volatile 就足以保证线程之间对象的安全共享。

关于java - Java中对象的初始化是线程安全的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com