Joh*_*ine 5 java concurrency multithreading real-time java-memory-model
这是一个简单的例子:
private long counter = 0;
// note this method is NOT synchronized
// this will be called by thread A
public void increment() { counter++; }
// note this method IS synchronized
// this will be called by thread B
public synchronized long value() { return counter; }
Run Code Online (Sandbox Code Playgroud)
所以我只想获得一个好的值counter,而不是 cpu 缓存中的卡住值,因为该变量是非易失性的。目标是不使计数器可变,因此它不会影响执行增量的线程 A,但仅影响线程 B,我不在乎,当它读取变量时。
只是为了记录,我计划counter在线程 A 已经完成时从线程 B 中读取 的值......
不,线程 B 中的同步块不确保它会读取 的实际当前值counter。您需要在两个线程中使用同步块来执行此操作。从实际角度来看,您的代码确保运行线程 B 的处理器使其缓存无效并从主内存中读取 的值counter,但它不能确保运行线程 A 的处理器将其当前值刷新到主内存,因此 main 中的值记忆可能已经陈旧。
由于在两个线程中使用 易失性变量比同步块更便宜,因此使用counter易失性变量可能是正确的解决方案。这就是易失性变量的用途。
编辑:如果线程 A 要在线程 B 读取最终值之前完成,您可以将线程 A 的整个执行包含在单个同步块中,或者让线程 B 在读取计数器之前加入线程 A,以确保线程 A 在线程 A 之前完成计数器被读取。这将导致在线程 A 执行结束时进行一次缓存刷新,这对性能的影响可以忽略不计。
| 归档时间: |
|
| 查看次数: |
1500 次 |
| 最近记录: |