java - 在java中,如果使用同步,即使考虑到不一致的值
问题描述
在这里,我使用synchronized
两个线程的通用计数器变量t1
,t2
但即使计数器值不一致,请任何人解释为什么它会给出这样的结果并给出解决方案。
public class Sync {
public static int counter = 0;
private static synchronized void increment() {
++counter;
}
public static void process() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++)
increment();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++)
increment();
}
});
t1.start();
t2.start();
}
public static void main(String[] args) {
process();
System.out.println("counter is:: " + counter);
}
}
它应该将计数器值设为 2000。
解决方案
因为您的主线程不会等待其他线程完成。它打印结果,而其他线程仍在递增计数器。
用于Thread.join()
修复它:
t1.join();
t2.join();
推荐阅读
- html - 为什么引导文本颜色类对我不起作用?
- python - 如何为多个组绘制带有注释的堆叠条
- watchman - 在 wsl2 ubuntu 上构建 watchman 时出错
- mysql - 错误 KnexTimeoutError: Knex: 获取连接超时。游泳池可能已经满了。你错过了一个 .transacting(trx) 电话吗?
- python - 如何使用 python 读取 ip camera(rtsp) 帧?
- python - QTreeWidget PyQt 中出现额外的行
- react-native - 无法解析模块...resolveAssetSource.js
- javascript - 如何在 Nuxt 中拥有像 turn.js 这样的翻书?
- vba - 用vba获取下一列的单元格
- android - HTTP 链接未在 Android Studio Java 中的 Android WebView 中打开?