Java多线程——自旋锁

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

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

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

自旋锁的场景

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

例如Java中AtomicBoolean

其他类型的锁

  • 读写锁(rwlock)

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

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

  • 递归锁(recursivelock)

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

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

Refer

CAS和自旋锁(spin lock)

你可能感兴趣的:(java,线程)