Pra*_*and 3 java multithreading
我正在学习易变量.我知道volatile的作用,我为Volatile变量编写了一个示例程序,但没有按预期工作.
为什么"计数"的最终值有时会低于2000.我使用了volatile,因此系统不应该缓存"count"变量,值应该始终为2000.
当我使用synchronized方法时它工作正常但不是volatile关键字.
public class Worker {
private volatile int count = 0;
private int limit = 10000;
public static void main(String[] args) {
Worker worker = new Worker();
worker.doWork();
}
public void doWork() {
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread1.start();
Thread thread2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < limit; i++) {
count++;
}
}
});
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException ignored) {}
System.out.println("Count is: " + count);
}
}
Run Code Online (Sandbox Code Playgroud)
先感谢您 !
Dav*_*rtz 10
当你这样做时count++,这是一个读取,一个增量,然后是一个写入.两个线程可以各自执行读取操作,每个线程都执行增量操作,然后每个线程执行写入操作,只产生一个增量.虽然您的读取是原子的,但您的写入是原子的,并且没有缓存任何值,这还不够.您需要的不仅仅是 - 您需要一个原子读 - 修改 - 写操作,volatile并不提供.
| 归档时间: |
|
| 查看次数: |
1089 次 |
| 最近记录: |