java中锁的分类

作者: 秦老厮 | 来源:发表于2019-08-23 23:04 被阅读15次

一、java中的锁从以下几个方面进行划分类别:

1.线程是否要锁住同步资源:

  • 锁住:悲观锁
  • 不锁住: 乐观锁 CAS

2.锁住同步资源失败,线程是否要阻塞:

  • 阻塞

  • 不阻塞:

    • 自旋锁
    • 适应性自旋锁

3.多个线程竞争同步资源的流程细节有没有区别:

  • 不锁住资源,多个线程中只有一个能修改资源成功,其他线程会重试: 无锁
  • 同一个线程执行同步资源时自动获取资源: 偏向锁
  • 多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放: 轻量级锁
  • 多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒: 重量级锁

4.多个线程竞争锁时是否要排队:

  • 排队:公平锁
  • 先尝试插队,插队失败再排队: 非公平锁 AQS

5.一个线程的多个流程能不能获取同一把锁:

  • 能:可重入锁
  • 不能:非可 重入锁

6.多个线程能不能共享一把锁:

  • 能:共享锁
  • 不能:排它锁(独占锁)

二、悲观锁与乐观锁:

悲观锁与乐观锁是一种广义的概念,体现的是看待线程同步的不同角度

1.悲观锁:悲观锁是认为自己在使用数据的时候一定有别的线程来修改数据,在获取数据的时候会先加锁,以确保数据不会被别的线程修改。
锁实现:关键字synchronized、接口Lock的实现类。
适用场景:写操作比较多,先加锁确保写操作时数据正确。

2.乐观锁:乐观锁是认为自己在使用数据时不会有别的线程修改数据,所以不会事先加锁,只是在更新数据时候去判断之前有没有别的线程更新了这个数据。
锁实现:CAS算法,例如AtomicInteger类的原子自增是通过CAS自旋实现
适用场景: 读操作较多,不加锁能够使其读操作的性能大幅提升

三、自旋锁:

自旋锁是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断地判断是否能够成功获取锁,直到获取到锁才退出循环。

自旋锁适用于同步代码块逻辑比较简单,执行时间很短的场景,这时使用阻塞的成本比较高,阻塞与唤醒线程都需要操作系统切换CPU状态,需要消耗一定时间,而使用自旋循环几次就获取到锁,同步成本比较低。

相关文章

  • Java中锁的分类

    Java中锁的分类

  • Java中的锁

    Java中的锁 参考了这篇:Java中的锁分类 公平锁/非公平锁(ReentrantLock/Synchroniz...

  • 不懂什么是锁?看完这篇你就彻底明白了!(建议先收藏)

    Java 锁分类 Java 中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对 Java 中一些常用锁的分...

  • 关于java锁,看完这篇你就彻底明白

    Java 锁分类 Java 中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对 Java 中一些常用锁的分...

  • 锁——Java中的锁分类

    https://www.cnblogs.com/baizhanshi/p/7211802.html

  • Java中的锁分类

    Java中的锁分类 在读良多并发文章中,会说起各类各样锁如公允锁,乐不雅观不雅观锁等等,这篇文章引见各类锁的分类。...

  • Java中的锁分类

    主要包括 synchronized、ReentrantLock、和 ReadWriteLock。参看

  • Java中的锁分类

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公...

  • Java中的锁分类

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公...

  • Java中的锁分类

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公...

网友评论

    本文标题:java中锁的分类

    本文链接:https://www.haomeiwen.com/subject/sjixectx.html