“Java 多线程为何会并发”这个问题,可以从为什么需要并发以及并发为什么会产生问题两个角度来理解。下面用通俗的方式说明。
线程A:读文件(等待)
线程B:计算任务(执行)
并发 ≠ 一定安全
根本原因:多个线程共享资源 + 执行顺序不确定
boolean stop = false;
// 线程A
while (!stop) {
// do something
}
// 线程B
stop = true;
❌ 可能:线程A永远看不到 stop = true
✅ 原因:CPU 缓存、指令重排序
✅ 解决:volatile、synchronized
count++; // 实际是:读 → +1 → 写
两个线程同时执行可能:
线程A读 count=1
线程B读 count=1
线程A写 count=2
线程B写 count=2
❌ 结果少加一次
✅ 解决:AtomicInteger、synchronized
a = 1;
b = 2;
可能被优化成:
b = 2;
a = 1;
在单线程没问题,多线程可能出错
✅ 解决:happens-before 规则、volatile
线程 ↔ 共享内存 ↔ 非原子操作 ↔ 调度不确定
| 原因 | 说明 |
|---|---|
| 多线程同时运行 | 时间片切换 |
| 共享变量 | 堆内存是共享的 |
| 操作不是原子 | i++、check-then-act |
| CPU/编译器优化 | 缓存、重排序 |
synchronizedvolatileLockAtomicXXXConcurrentHashMap)如果你愿意,我也可以:
你想从哪一块深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。