Java 相当于 .网络的互锁类?
2022-09-03 04:56:44
如何在Java中以原子方式和线程安全地修改int?
原子增量,测试和设置等?
如何在Java中以原子方式和线程安全地修改int?
原子增量,测试和设置等?
螺纹安全可以通过同步功能实现。将 int(或此类数据)包装在一个类中,该类通过同步方法提供所需的功能,例如
public class X
{
protected int x;
public synchronized void set( int value )
{
x = value;
}
}
你也可以使用 java.util.concurrent.atomic package 中的类,例如 AtomicInteger 或 AtomicIntegerArray
我只是想确保指出这个答案到底出了什么问题,以防有人认为这可以用来解决线程竞争效应。synchronized
| Thread A | Thread B |
|---------------|------------------|
| read x (x=4) | |
| | read x (x=4) |
| Calculate 4+1 | |
| EAX ← 5 | |
| | Calculate 4+1 |
| | EAX ← 5 |
| Start sync | |
| { | Start sync |
| { x ← 5 | wait |
| { | wait |
| End sync | wait |
| | { |
| | { x ← 5 |
| | { |
| | End sync |
操作的最终结果:
x = 4;
x += 1;
x += 1;
是 x = 5 而不是 6。
关键字也存在同样的问题。关键字不会将您从线程效果中拯救出来。volatile 关键字仅确保volatile
volatile
严格来说,确保内存操作不会围绕易失性变量重新排序。这意味着您仍然患有:volatile
问题。