【发布时间】:2018-05-26 11:26:28
【问题描述】:
我在java中的多线程方面非常新手,所以如果有人能给我简要解释以下内容,我将不胜感激:
这是我的代码:
public class Lesson6 {
private static volatile Long value = 0L;
public static void main(String[] args) throws InterruptedException {
Thread inc = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (this){
++value;
}
}
}
});
inc.start();
Thread dec = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (this){
--value;
}
}
}
});
dec.start();
inc.join();
dec.join();
System.out.println(value);
}
}
在我看来,输出应该为零,但绝不是零。调试器显示,随着 run() 方法的运行,THIS 总是会有所不同。为什么会这样?
谢谢。
【问题讨论】:
-
“这个”不正确。这是两个不同的对象,所以不同的同步监视器。一定要使用相同的对象,例如‘final Object lock= new Object();’
-
您必须锁定同一个对象。
this对于每个对象都不同。 -
您很可能想让
value成为原始long而不是对Long的引用 -
请使用“Lesson6.class”而不是“this”
标签: java concurrency synchronization