【发布时间】:2018-06-11 11:08:27
【问题描述】:
我正在尝试在多线程环境中对 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() 方法,但我仍然得到不一致的结果。 这里加入不是意味着主线程要等到每个线程完成执行吗?我什至尝试将同步添加到三个方法签名中的每一个;但我得到不一致的结果。
除了使用 Atomic 版本的变量,我还能如何确保我总是得到 0?
【问题讨论】:
-
为什么你不想使用 AtomicInteger ?
-
@ValentinMichalak 这些只是为了我的锻炼目的。除了使用 AtomicInteger 之外,尝试所有可能的解决方案。
-
练习提示:永远不要有空的 catch 块。
标签: java multithreading concurrency