|
6
|
| Pablo Fernandez · 技术社区 · 15 年前 |
|
|
1
5
Java在内存模型发生之前发生了一个事件。在写路径和读路径上都需要一些通用的并发构造(例如,synchronized block/method、lock、volatile、atomic)来触发这种行为。 如果同步这两个方法,则会在整个对象上创建一个锁,该锁将由读线程和写线程共享。JVM将确保在离开(synchronized)setint方法之前在写入线程上发生的任何更改在进入(synchronized)getint方法之后对任何读取线程都可见。JVM将插入必要的内存屏障,以确保发生这种情况。 如果只同步了写入方法,则对对象的更改可能对任何读取线程都不可见。这是因为在读取路径上没有一个点是JVM可以用来确保读取线程的可见内存(缓存等)与写入线程一致的。使getint方法同步将提供此功能。 注意:特别是在这种情况下,使字段“number”变为volatile将提供正确的行为,因为volatile读/写在JVM中也提供相同的内存可见性行为,setint方法内部的操作只是一个赋值。 |
|
|
2
5
在样本前的书中有解释(第35页): “仅同步setter是不够的:调用get的线程仍然可以看到过时的值。” 过时的数据:当读线程检查就绪时,它可能会看到一个过期的值。除非使用同步 每次访问变量时 ,可以看到该变量的过时值。更糟糕的是,过时不是全部或全部:线程可以看到一个变量的最新值,但可以看到另一个首先写入的变量的过时值。 |
|
|
3
1
如果只同步setter方法,则只能保证属性不会被错误地修改,但在尝试读取变量时不能确保它是过时的值。 |
|
|
4
-1
因为
|
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
SpeakX · 多线程上下文中的弱指针未过期时更新 2 年前 |
|
USMC6072 · 在父事件处理程序中调用异步方法会引发错误 3 年前 |
|
|
Eric · fgets_unlocked()用于多线程读取不同文件 4 年前 |