Java多线程——自旋锁

5 篇文章 0 订阅

自旋锁(spin lock) 和 互斥锁(mutual exclusion lock)

  • 没有获得锁的调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,这就是自旋锁,他不用将线城阻塞起来(NON-BLOCKING);

  • 互斥锁 最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象。

自旋锁的场景

真正的自旋锁是针对多核CPU,而往往应用是单进程的,所以我们见到的自旋锁是使用了自旋锁的概念的一种实现,却是针对多线程的。

例如Java中AtomicBoolean

image

其他类型的锁

  • 读写锁(rwlock)

    高级别锁,区分读和写,符合条件时允许多个线程访问对象。处于读锁操作时可以允许其他线程和本线程的读锁,但不允许写锁,处于写锁时则任何锁操作都会睡眠等待;常见的操作系统会在写锁等待时屏蔽后续的读锁操作以防写锁被无限孤立而等待,在操作系统不支持情况下可以用引用计数加写优先等待来用互斥锁实现。

    读写锁适用于大量读少量写的环境,但由于其特殊的逻辑使得其效率相对普通的互斥锁和自旋锁要慢一个数量级;值得注意的一点是按POSIX标准 在线程申请读锁并未释放前本线程申请写锁是成功的,但运行后的逻辑结果是无法预测

  • 递归锁(recursivelock)

    严格上讲递归锁只是互斥锁的一个特例,同样只能有一个线程访问该对象,但允许同一个线程在未释放其拥有的锁时反复对该锁进行加锁操作,但别的线程也只能等待该线程释放所有次数的锁才可以获得锁;

    windows下的临界区默认是支持递归锁的,而Linux下的互斥量则需要设置参数PTHREAD_MUTEX_RECURSIVE_NP,默认则是不支持

Refer

CAS和自旋锁(spin lock)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值