简短结论:volatile 不能替代锁(如 synchronized、Lock),它们解决的问题不同,使用场景也不同。
下面详细说明。
volatile 能做什么volatile 主要保证两件事(JMM 层面):
可见性
volatile 变量,其他线程能立刻看到最新值禁止指令重排序(有序性)
volatile 变量的写操作,happens-before 后续的读操作示例(适合 volatile):
volatile boolean running = true;
void run() {
while (running) {
// do work
}
}
volatile 不能做什么(关键)例如:
volatile int count = 0;
void inc() {
count++; // 非原子操作
}
count++ 实际是:
多个线程同时执行时,仍然会丢失更新。
✅ 正确做法:
synchronizedAtomicInteger锁(synchronized / ReentrantLock)能保证:
示例:
synchronized void inc() {
count++;
}
volatile 替代锁?只在非常有限的情况下:
✅ 适合 volatile 的场景:
❌ 不适合:
i++、check-then-act)
volatile解决“看得见”,锁解决“不会乱”。
volatile ≠ 锁volatile 不能替代锁如果你愿意,我可以给你画一个 volatile vs synchronized 对比表,或者结合你具体的业务场景分析该用哪个。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。