java - 同步不会阻止并发
问题描述
我在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 总是会有所不同。为什么会这样?
谢谢。
解决方案
调试器显示,随着 run() 方法的运行,这总是不同的
每个new Runnable
都是不同的对象,因此this
在每种情况下都是不同的。
如果您使用通用对象,该程序应该可以工作。
顺便说一句,我建议对值使用原语long
而不是对Long
public class Lesson6 {
private static volatile long value = 0L;
public static void main(String[] args) throws InterruptedException {
final Object locked = new Object();
Thread inc = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (locked){
++value;
}
}
}
});
inc.start();
Thread dec = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (locked){
--value;
}
}
}
});
dec.start();
inc.join();
dec.join();
System.out.println(value);
}
}
印刷
0
推荐阅读
- java - Java:关闭挂钩中的线程
- javascript - 获得多边形矢量乘积的函数式方法
- python - 来自其他人的值的熊猫新列
- tinyos - 在 Tinyos 中接收和发送
- nhibernate - NHibernate 选择特定列
- php - 如何在 jquery select2 laravel 中设置选定值?
- json - PowerShell:并行处理多个 API 帖子
- python - OpenCV Python激光点跟踪提取x和y坐标并将其存储到不同的变量中
- maven - 使用 spotify/docker-maven-plugin 删除 docker 镜像中的文件
- keras - 如何获取 Keras 变量的值