java的同步说白了就是要保证运行程序的顺序一致性java
顺序一致性:顺序一致性模型是被计算机科学家理想化的理论参考模型,为程序员提供了极强的内存可见性保证,两大特性:程序员
可是JMM自己没有对多线程下的执行顺序作一致性的保证,在顺序一致性模型中,全部操做彻底按照程序顺序串行执行,在JMM中,临界区的代码能够从新排序,单会在临界区的时间点作一些特殊处理,保证虽然在临界区内作了重排序,可是因为监视器的互斥特性,B没法观察到A的重排序,既提升了执行效率,有没有改变执行的结果。多线程
可是若是没有执行同步操做,JMM不保证执行结果跟顺序一致性模型的结果同样,由于这样的话,就须要禁用大量的处理器和编译器的优化,对执行的性能会产生很大的影响。未同步的程序在顺序一致性模型中,总体是无序的。结果没法预知,保证未同步程序的两个模型的执行结果没什么意义。性能
如何理解上边这段话呢,个人见解是这样,顺序一致性模型的是理想的模型,可是现实很骨感,若是要作大这种模型,就对于处理器的优化和编译器的优化形成很大的影响,可是若是单单是为了同步这个事儿,把这些优化都给取消掉了的话,得不偿失。这也能够理解成为何java语言再设计的时候干吗不直接把这些须要考虑的同步问题都给屏蔽了呢,直接让语言来保证这个,就是由于这涉及到大量的处理器的的指令优化的损失。优化
java的同步机制呢,就是设法,在专门对于临界操做的时候呢作一些处理,保证他看着跟顺序一致性水样的可是还不影响大执行的优化,编译器的优化。线程