Shi*_*nha 2 java multithreading
我理解volatile变量只保证可见性,不应该用于原子/复合操作.但是我想我读了一些只有在一个线程更新值时才能使用它(在单个操作中).它是否正确 ?
所以如果两个线程正在更新一个volatile变量,那么boolean flag是否可以安全?
我理解volatile变量只能保证可见性和
正确
不应该用于原子/复合操作.
实际上所有的AtomicXxxx类都使用volatile.他们以安全的方式使用它,这是重要的区别.并非所有操作都是安全的.
我想我读过一些只有在一个线程更新值时才能使用的地方.它是否正确 ?
这是一个解决方案.如果您只有一个作者,那么使用volatile该字段就可以了.
注意:通常的误解是volatile为任何使用它的操作赋予线程安全性.例如
volatile int[] a = { 0 };
a[0]++; // not thread safe even if you have only 1 writer.
Run Code Online (Sandbox Code Playgroud)
这是因为写入a并且只是a易失性.任何a指向的东西也不是也volatile 没有什么不同final
final int[] a = { 0 };
a = null; // cannot do this
a[0] = 1; // compiles fine, is not final.
Run Code Online (Sandbox Code Playgroud)
我已经为你缩小了方案:如果两个线程正在更新一个volatile变量,请说boolean flag(在单个操作中,例如将其设置为true或false)并且没有任何其他形式的同步,n是否该线程安全?
只有你有一个作家,或者他们都设置为相同的值,这是唯一安全的.例如
flag = true; // ok, provided no thread sets it to false.
flag = !flag; // not ok.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |