JAVA锁机制

synchronized和Lock均为可重入锁。即可为该对象多次加锁,通过锁标志+1进行操作;当所标志为 0时,释放所。重入锁目的是为防止死锁发生。

synchronized:基于系统内核实现线程等待(通过linux系统pthread_mutex_lock命令进行等待)。
        a、将线程通过CAS操作放入ContentionList队列头部。
        b、当Owner拥有锁者unlock时,会将ContentionList队列中的内容移动到EntryList中,并将头结点设置为ready,可以去竞争锁。
        c、当Owner拥有锁者被wait时,进入waitSet队列。被notify时重新进入EntryList中,进行锁竞争。

        自旋锁:线程被阻塞为系统阻塞,处于内核态,java执行为用户态;为避免经常在用户态和内核态频繁切换导致性能下降,实现了自旋锁(即没竞争到锁后,自己循环一段时间竞争锁,如果超期没获得,再阻塞)。

        偏向锁:线程加锁操作采用CAS操作。当线程已经获得锁后,再重入该锁时,后续操作将不会采用CAS,因为不存在锁竞争。

        

Lock:JAVA自己实现。基于AQS非阻塞队列和CAS原子操作实现。
        a、将所有请求锁的线程通过CAS放入AQS队列(FIFO)中,如果失败则无线循环放入。阻塞调用LockSupport.park完成,park调用sun.misc.Unsafe.park本地方法实现。最终也是调用pthread_mutex_lock。AQS也是一个CHL队列,即实现了自旋锁,所以这是一个非公平锁。
        b、也实现了自旋锁和偏向锁(JAVA代码实现)。

俩种锁对比:Lock扩展性强,因为是JAVA实现的,可以基于AQS实现其他锁功能(读写锁、中断锁)。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值