synchronized
关键字提供了一种锁的机制,能够确保共享变量的互斥访问,从而防止数据不一致问题的出现。synchronized
关键字包括monitor enter和monitor exit两个JVM指令,它能够保证在任何时候任何线程执行到monitor enter成功之后都必须从主内存中获取数据,而不是从缓存中,在monitor exit运行成功之后,共享变量被更新后的值必须刷入主内存synchronized
的指令严格遵守java happens-before规则,一个monitor exit指令之前必须有一个monitor enter
this monitor/Class monitor:
在一个类中若是同时声明了synchronized(this)或者是方法,则这个类中的方法都会使用同一个monitor,这个类的方法都是同步的。需要等待释放。