Synchronized,ReentrantLock的实现原理及异同比较 、Java中其他锁的理解

本文详细介绍了Synchronized同步锁的作用域和底层实现,包括对象锁和类锁的概念。接着,探讨了ReentrantLock的内部结构,锁的获取与释放过程,并对比了其与Synchronized的异同。文章还涵盖了Java中各种锁的理解,如公平锁与非公平锁、自旋锁与自适应自旋,以及轻量级锁和偏向锁的特性与应用场景。
摘要由CSDN通过智能技术生成

1)Synchronized 同步锁


作用域:不同加锁方式对应不同作用域
1) 对象锁

当一个对象访问Synchronized方法时,锁类型为对象锁。
此时该对象不能同时访问类中其他Synchronized方法
。若一个对象中有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,则其它线程不能同时访问这个对象中任何一个synchronized方法。
此外,不同对象实例的synchronized方法是不相干预的。也就是说,其它线程可以同时访问此类下的另一个对象实例中的synchronized方法;

2) 类锁 :对该类的所有对象实例起作用。

当对静态方法加锁时,锁类型为类锁。相当于给类加锁(synchronized.Class),静态方法被调用时(类名.方法名),会先检测调用类有没有持有锁,持有锁时,等待。

锁的底层实现:

使用一个monitor对象,由ObjectMonitor实现(C++代码)
在这里插入图片描述

Class字节码中
1)对象加锁时,使用monitorenter指令得到monitor对象。检查owner是否为空
在这里插入图片描述
monitorenter操作的目标一定是对象,类型是reference。Reference实际就是堆里的一个存放对象的地址。每个对象(reference)都有一个monitor对应。
2)方法加锁时
常量池中多了ACC_SYNCHRONIZED标示符。JVM就是根据该标示符来实现方法的同步的:当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值