卖自己做的网站去哪,网络舆情监控系统,网站建设数据库配置,wordpress上传录音Synchronized实现
Synchronized创建的时候一个互斥的对象锁#xff0c;每次只有一个线程可以获取该锁。
其底层主要是基于Monitor实现的#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构
对象在内存中存储主要分为三个部分#xff1a…Synchronized实现
Synchronized创建的时候一个互斥的对象锁每次只有一个线程可以获取该锁。
其底层主要是基于Monitor实现的在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构
对象在内存中存储主要分为三个部分对象头实例数据对齐填充。 对象头MarkWord用于存储锁的信息Klass Word用于存储对象的类型。
无锁状态hashcode25位 对象分代年龄4位不是重点 偏向锁标识1位 锁标识2位偏向锁thread23位线程id 偏向时间戳2位不是重点 偏向锁标识1位 锁标识2位轻量级锁对应线程的栈中指向锁记录的指针。30位重量级锁对应monitor的地址。30位 实例数据用于存储对象中成员变量的信息。
对齐填充不是重点主要是为了保证长度是8的整数倍。
Monitor重量级锁
其中包括三个部分waitSetentryListowner。
owner存储当前获得锁的线程的id。
enrtyList存储没有获取到锁的线程id的集合这些线程处于堵塞状态。
waitList存储处于等待的线程的集合通常这些线程调用了wait方法。
当线程要获取锁的时候会先去owner判断是否有线程存在如果没有的话直接获取锁并将线程id写入owner反之写入entryList。
轻量级锁
重量级锁主要使用在线程竞争的时候且重量级锁涉及进程的上下文切换效率比较低下在没有线程竞争且不同线程交替执行的时候推荐使用轻量级锁。 上锁
在线程栈中创建一个锁记录锁记录中包含 锁记录地址和指向对象的指针两个部分。通过CAS指令将锁记录地址和MarkWord中的地址进行交换。
1.如果对象处于无锁状态则说明获取锁成功且获取的是轻量级锁。
2.如果对象已经有锁了这此时就是锁的重入会继续创建锁记录且也会进行做CAS指令但是 记录锁的地址为null。起到锁重入计数效果。
3.如果CAS指令失败了则会直接使用重量级锁。
解锁
1.遍历线程栈找到对象指针指向锁对象的锁记录。
2.如果锁记录中的MarkWord的值为null说明这是一次锁重入操作直接将锁记录中的指向对象的地址设置为null。
3.如果锁记录中的MarkWord的值不为null我们就通过CAS指令将锁对象中的MarkWord恢复成无锁状态。
偏向锁
类是轻量级锁但是在做锁的重入的时候不会使用CAS指令而是直接判断thread的id是否相同相同就表示没有竞争。减少了CAS指令操作。适合使用在长时间只有一个线程使用锁。 所有锁一但发生了冲突都会变成重量级锁。
三种锁的使用场景