Java锁学习笔记

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中一定是在堆内存中的 那么布局其实就是对象在堆内存中的布局

对像的组成

  1. 对象头(64位操作系统 96bit 32位操作系统 64bit)

    1. 包含了
    2. class 存在于klass pointer 中指向jvm的元空间
    3. age gc hashcode sync state 存在于markword中

  2. 实例数据(大小不确定)

  3. padding 64位操作系统 一定要8字节的整数 其实数据库中也有padding

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值