Java 的锁
我的理解锁的终极奥义就是修改变量值
对于ReentrantLock lock 当没有线程冲突的时候是在Java级别实现的,但是一旦拿不到线程,发生了线程冲突就到了操作系统级别了
// 底层原理 就是如果加锁成功就直接返回让语句正常执行
// 加锁失败 就是lock阻塞(睡眠)(park 调用操作系统函数)
// 成功就是改变一个变量的值 state
lock.lock()
对于Synchronized关键字,他锁的不是我们的代码块也不是一个方法而是你的对象
// 本质是修改了对象的一个对象头(属于对象的一部分)
Synchronized (a){
}
synchronized 实现的只是同步,在操作系统中是线程互斥,在底层中调用的是内核代码mutex();
偏向锁:这个锁只有一个线程访问,不调用操作系统函数,只记录线程id到对象头,如果同一个线程再次访问,会到对象header中查找线程id是否相同,偏向这个线程。 在对象头中是1(能否偏向) 01(无锁),计算了hashcode就不可偏向
轻量锁:没有资源竞争 00 执行结束后会变回001 无锁不可偏向
重量锁:存在资源竞争 调用 mutex(); 10
当id和head中的线程id不相同
加锁就是在对象头中的一个地方修改变量
接下来我们要看看对象的布局
我们知道对象在java中一定是在堆内存中的 那么布局其实就是对象在堆内存中的布局