Java中锁大致上分为两类:一类是显示锁,一类是隐式锁;今天我们重点来分析一下java中隐式锁的实现:
java中通过synchronized关键字类实现隐式锁:
首先synchronized这个关键字,我们的字节码文件在被翻译为机器语言的时候,这个关键字会直接在synchronized编译为队指令 monitorEnter ,monitorExit ,在这对指令之间的代码,cpu在处理时候,会要求所有访问这一段区域的线程,串行化执行。
synchronized的语义大致上就是上面的那张图片中所显示的:
在synchronized包裹的代码段中同一时间只能够有一个线程能够访问,其他的线程会在这个时候处于等待状态,知道直到上一个抢道资源的线程执行完毕,同时,在非同步块中的代码,访问时不受限制的。
需要注意的是synchronized 同步块的使用有多种方式:
1.实例方法级别的同步:这个时候被用来作为锁对象的是this对象,如果这个时候this是一个多例的话,jvm实际上在执行的时候不会这段代码加锁,这就是java内置锁的消除
3.类对象级别的锁:类对象有两种写法
锁对象的内存结构:
对象头:这里涉及到一个java内置锁对象的膨胀升级。
synchroized在使用的过程中不能够跨方法使用,我们有没有可能不是java的关键字来自己添加锁呢?
我们可以通过UnSafe 这个类来手动的添加锁和释放锁:
锁的粗化:
锁的消除:
java 内置锁的膨胀升级