Luc*_*cky 12 java multithreading volatile
可能类似的问题:
synchronized关键字添加到我的每个方法中.那没用.然后我将volatile关键字添加到每个字段.问题似乎只是解决了问题.
经过一些实验,我发现负责的领域是一个GameState跟踪我的游戏当前状态的对象,可以是正在播放也可以是忙碌.忙时,游戏会忽略用户输入.我所拥有的是一个不断更改state变量的线程,而Event线程读取state变量.但是,在一个线程更改变量后,另一个线程需要几秒钟来识别更改,这最终会导致问题.
它是通过制作状态变量来修复的volatile.
为什么volatile默认情况下不是Java中的变量,以及不使用volatile关键字的原因是什么?
Ada*_*son 32
长话短说,易变量 - 无论是Java还是C# - 都不会在线程中本地缓存.除非您正在处理在不同内核上执行线程的多处理器/多核CPU,否则这并没有多大意义,因为它们正在查看相同的缓存.当您将变量声明为volatile时,所有读取和写入都直接来自并直接进入实际的主存储器位置; 没有涉及缓存.当涉及到优化时,这会产生影响,并且不必要地(当大多数变量不需要变化时)这样做会对相对较小的增益造成性能损失(尽管可能或可能不是很微不足道).
Jon*_*eet 10
当您尝试编写低级线程安全的无锁代码时,实际上只需要Volatiles.您的大多数代码可能不应该是线程安全的或无锁的.根据我的经验,你已经发现,简单的版本后,无锁编程是唯一值得尝试做做锁定招致显著的性能损失,由于锁定.
更令人愉快的选择是使用其他构建块java.util.concurrent,其中一些是无锁的,但不要像在低水平尝试自己完成所有这一样.
波动性有其自身的性能成本,并且大多数代码都没有理由承担这些成本.
虽然其他人指出为什么默认为volatile是个坏主意是正确的,但还有另外一点要做:代码中很可能存在错误.变量很少需要使用volatile:总是有一种方法可以正确地同步对变量的访问(通过synchronized关键字,或者使用来自java.util.concurrency的AtomicXxx对象):异常包括操作这些的JNI代码(不受同步约束)指令).
因此,您可能想要找出解决问题的原因,而不是添加volatile.它不是解决它的唯一方法,可能有更好的方法.
| 归档时间: |
|
| 查看次数: |
5482 次 |
| 最近记录: |