synchronized在多线程中有两种主要的功能
JMM关于synchronized的两条规定:
重排序:编译器或处理器为了提高程序性能而作的优化。
as-if-serial:无论如何重排序,程序执行的结果应该与代码顺序执行的结果一致(Java编译器运行时和处理器都会保证Java在单线程下遵循as-if-serial语义)。
通过加入内存屏障和禁止重排序优化来实现的
eg:num++;包含三步操作,volatile无法保证原子性,多线程操作时,虽然保留了可见性,但无法保持同步。
解决方案:
原文地址:http://blog.csdn.net/u010366796/article/details/45191891