8款提升论文写作效率的智能工具解析
2026/10/26 7:08:27
volatile解决的是可见性问题和禁止指令重排序(内存屏障),但不保证原子性。
synchronized解决的是可见性、原子性和有序性问题(通过monitor锁的happens-before规则)。
| 特性 | volatile | synchronized |
|---|---|---|
| 原子性 | ❌ 不保证 | ✅ 保证(代码块/方法整体原子执行) |
| 可见性 | ✅ 保证(写入立即刷新到主内存) | ✅ 保证(解锁前写入主内存) |
| 有序性 | ✅ 有限保证(禁止指令重排序) | ✅ 保证(遵循happens-before规则) |
| 性能 | 轻量级,仅内存操作 | 重量级,涉及锁的获取和释放 |
| 适用场景 | 状态标志、一次性发布等 | 临界区保护、复合操作等 |
从能力上来说:synchronized理论上可以替代volatile,因为synchronized保证了:
从实践上来说:不需要也不应该用synchronized替代volatile
// 状态标志位 - volatile是最佳选择publicclassShutdownManager{privatevolatilebooleanshutdownRequested=false;publicvoidrequestShutdown(){shutdownRequested=true;// 单写操作}publicbooleanisShutdownRequested(){returnshutdownRequested;// 多读操作}}// 双重检查锁定单例模式publicclassSingleton{privatestaticvolatileSingletoninstance;publicstaticSingletongetInstance(){if(instance==null){synchronized(Singleton.class){if(instance==null){instance=newSingleton();// 需要volatile防止重排序}}}returninstance;}}// 复合操作 - volatile无法保证原子性classCounter{privatevolatileintcount=0;// volatile在这里没用!publicvoidincrement(){count++;// 实际上分成三步:读、改、写}}// 需要synchronized的正确实现classSafeCounter{privateintcount=0;publicsynchronizedvoidincrement(){count++;}}// 多线程频繁读取的场景publicclassConfiguration{// volatile读取几乎无开销,只是内存访问privatevolatileStringconfigValue;publicStringgetConfig(){returnconfigValue;// 纯读操作,volatile最合适}// 如果用synchronized,每次读取都要获取锁privateStringconfigValue2;publicsynchronizedStringgetConfig2(){returnconfigValue2;// 性能差!}}能力包含关系:synchronized的功能包含volatile的功能,但反之不成立
设计原则:应该使用能满足需求的最轻量级机制
选择指南:
使用volatile当:
使用synchronized当:
重要原则:不要因为synchronized"更强大"就滥用它。并发编程中,应该选择最简单、最明确的工具来解决特定问题。
volatile能解决的问题synchronized都能解决,但从性能和设计角度,应该使用最适合的工具。