Synchronized - 对象锁

语法:

最初最好对对象进行封装

Synchronized(对象){
临界区代码
}
方法上的synchronized

加在普通方法上: 锁住类对象

image1

加在静态方法上: 锁住类的字节码对象(共享且唯一)

作用 1.保证此处的代码执行的原子性,不会有多个线程来搞
但是内部代码仍然可能出现指令的重排序


2.加锁会清缓存,解锁会把缓存写进主存
去了解一下 JMM 的八大原子操作和规则,对理解这一块儿的东西很有用 我的总结就是:在单线程中,值如果读取一定次数不变的情况下,JIT编译器会将值固定给变量(优化,JVM执行状态的5个层次)。


多线程中,因为JIT编译器优化就会导致读取不到最新的值,所以要阻止这种优化。指令重排这个前面老师又讲,这里主要是将没有讲的JVM原理结合