synchronized:内存屏障、CPU硬件级别的原理,原子性、可见性、有序性、指令重排、偏向锁等等
用法: 可以对对象加锁,也可以对类加锁
synchronized(myObject){
//一堆代码
synchronized(myObject){
//一堆代码
}
}
synchronized(otherObject.class){
//一堆代码
}
synchronized该关键字在编译成class文件后可以看到对应的语句是monitorEnter与monitorExit
synchronized底层原理,跟JVM指令和monitor有关。如果用到了synchronized关键字,在底层编译后的JVM指令中,会有monitorenter和monitorexit两个指令
monitorenter指令执行:
每个对象都有一个关联的monitor,一个对象实例就有一个monitor,一个类的class对象也有一个monitor。如果要对这个对象加锁,那么必须获取这个对象关联的monitor的lock锁
原理:
monitor中有个计数器,默认为0。如果一个线程要获取monitor的锁,会去判断当前计数器是否为0,如果为0,那么可以获得锁,然后对计数器加1。
对象锁重入
如果一个线程第一次synchroniz