我正在尝试在多线程环境中 int 变量的经典增量/减量。这是我的示例代码。
public class SyncIncDec {
public static void main(String[] args) {
SyncCounter count = new SyncCounter();
Thread incThread = new Thread(() -> {
count.increment();
});
Thread decThread = new Thread(() -> {
count.decrement();
});
Thread displayThread = new Thread(() -> {
System.out.println("Count value : " + count.getX());
});
incThread.start();
decThread.start();
displayThread.start();
try {
incThread.join();
} catch (InterruptedException e) {
// e.printStackTrace();
}
try {
decThread.join();
} catch (InterruptedException e) {
// e.printStackTrace();
}
try {
displayThread.join();
} catch (InterruptedException e) {
// e.printStackTrace();
}
}
}
class SyncCounter {
private int x=0;
public SyncCounter() {
super();
}
public SyncCounter(int y) {
super();
x = y ;
}
synchronized int getX() {
return x;
}
void setX(int y) {
x = y ;
}
void increment() {
++x;
}
void decrement() {
--x;
}
}
尽管我对所有三个线程都使用了 join() 方法,但我仍然得到不一致的结果。
这里的 join 不是意味着主线程要等待每个线程完成执行吗?我什至尝试将同步添加到三个方法签名中的每一个中;但我得到的结果不一致。
除了使用变量的原子版本之外,我还能如何确保始终得到 0?
你调用join()
仅在所有线程启动后才在三个线程上。所以你不能保证所引用的线程displayThread
变量在递增和递减计数器的线程之后运行。
为了确保这一点,请调用join()
在您启动这些线程后:
incThread.start();
decThread.start();
incThread.join();
decThread.join();
displayThread.start();
它将阻塞当前线程,直到执行递增和递减,无论顺序如何join()
后被调用start()
调用这些线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)