详细介绍Java中的各种锁

 更新时间:2021年06月22日 14:09:30   作者:小小蜗牛139  
不少同学开始慢慢接触多线时候,对线程之间为了保障数据安全性,一致性有所了解,本文详细解介绍java中的21种锁 ,需要的朋友可以参考下

一、一张图了解21种锁

在这里插入图片描述

二、乐观锁

应用 
	CAS
思想
	一种乐观思想,假定当前环境是读多写少,遇到并发写的概率比较低,读数据时认为别的线程不会正在进行修改
实现
	写数据时,判断当前 与期望值是否相同,如果相同则进行更新(更新期间加锁,保证是原子性的)

三、悲观锁

应用 
	synchronized、vector、hashtable
思想:
	一种悲观思想 ** ,即认为写多读少,遇到并发写的可能性高
实现
	每次读写数据都会认为其他线程会修改,所以每次读写数据时都会上锁
缺点
	他线程想要读写这个数据时,会被这个线程block,直到这个线程释放锁然后其他线程获取到锁

四、自旋锁

应用 
	CAS
实现
	为了让线程等待,我们只须让线程执行一个忙循环
优点
	 避免了线程切换的开销,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给Java虚拟机的并发性能带来了很大的压力
缺点
	占用处理器的时间,如果占用的时间很长,会白白消耗处理器资源,而不会做任何有价值的工作,带来性能的浪费
改进
	自旋等待的时间必须有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,就应当使用传统的方式去挂起线程
jvm调优
	-XX:PreBlockSpin 设置固定失败次数
	自适应自旋 前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定的,通过系统监控进行调整

五、悲观锁

应用 
	synchronized、vector、hashtable
思想:
	一种悲观思想 ** ,即认为写多读少,遇到并发写的可能性高
实现
	每次读写数据都会认为其他线程会修改,所以每次读写数据时都会上锁
缺点
	他线程想要读写这个数据时,会被这个线程block,直到这个线程释放锁然后其他线程获取到锁

六、可重入锁(递归锁)

应用 
	synchronized、Reentrantlock、Lock
思想:
	 任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞
实现
	 通过组合自定义同步器来实现锁的获取与释放
	 获取锁:识别获取锁的线程是否为当前占据锁的线程 ,如果是,则再次成功获,。获取锁后,进行计数自增
	 释放锁:释放锁时,进行计数自减
优点:
	 避免死锁
缺点
	他线程想要读写这个数据时,会被这个线程block,直到这个线程释放锁然后其他线程获取到锁

七、读写锁

应用 
	ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet
思想
	读写分离 
实现
	Java 提供了读写锁,在读的地方使用读锁,在写的地方使用写锁
	读锁: 允许多个线程获取读锁,同时访问同一个
	写锁: 只允许一个线程获取写锁,不允许同时访问同一个资源
优点:
	 避免死锁
缺点
	他线程想要读写这个数据时,会被这个线程block,直到这个线程释放锁然后其他线程获取到锁

八、公平锁

应用 
	Reentrantlock(true)
思想
	多个线程按照申请锁的顺序来获取锁
实现
	在并发环境中,每个线程会先查看此锁维护的等待队列,如果当前等待队列为空,则占有锁,如果等待队列不为空,则加入到等待队列的末尾,
	按照FIFO的原则从 队列中拿到线程,然后占有锁

九、非公平锁

应用 
	synchronized、reentrantlock(false)
思想
	线程尝试获取锁,如果获取不到,则再采用公平锁的方式
实现
	多个线程获取锁的顺序,不是按照先到先得的顺序,有可能后申请锁的线程比先申请的线程优先获取锁

十、共享锁

应用 
	ReentrantReadWriteLock中读锁
思想
	可以有多个线程获取读锁,以共享的方式持有锁

十一、独锁

应用 
	synchronized、vector、hashtable、ReentrantReadWriteLock中写锁
思想
	是一种思想: 只能有一个线程获取锁,以独占的方式持有锁

十二、重量级锁

应用 
	synchronized
思想
	synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的,监视器锁本身依赖底层的操作系统的 Mutex Lock来实现。
缺点
	操作系统实现线程的切换需要从用户态切换到核心态,成本非常高。这种依赖于操作系统 Mutex Lock来实现的锁称为重量级锁。
改进
	为了优化synchonized,引入了轻量级锁,偏向锁。

十三、轻级锁

应用 
	锁优化技术
思想
	轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量。
	轻量级是相对于使用操作系统互斥量来实现的重量级锁而言的。
	轻量级锁在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
	如果出现两条以上的线程争用同一个锁的情况,那轻量级锁将不会有效,必须膨胀为重量级锁。
优点
	如果没有竞争,通过CAS操作成功避免了使用互斥量的开销
缺点
	如果存在竞争,除了互斥量本身的开销外,还额外产生了CAS操作的开销,因此在有竞争的情况下,轻量级锁比传统的重量级锁更慢

到此这篇关于详细介绍Java中的各种锁的文章就介绍到这了,更多相关Java锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot快速实现接口消息加密的过程详解

    SpringBoot快速实现接口消息加密的过程详解

    在项目中,为了保证数据的安全,我们常常会对传递的数据进行加密,常用的加密算法包括对称加密(AES)和非对称加密(RSA),博主选取码云上最简单的API加密项目进行下面的讲解,需要的朋友可以参考下
    2023-11-11
  • Spring Boot项目集成UidGenerato的方法步骤

    Spring Boot项目集成UidGenerato的方法步骤

    这篇文章主要介绍了Spring Boot项目集成UidGenerato的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Linux环境卸载Centos7自带的OpenJDK和安装JDK1.8图文教程

    Linux环境卸载Centos7自带的OpenJDK和安装JDK1.8图文教程

    CentOS系统是开发者常用的Linux操作系统,安装它时会默认安装自带的旧版本的OpenJDK,但在开发者平时开发Java项目时还是需要完整的JDK,这篇文章主要给大家介绍了关于Linux环境卸载Centos7自带的OpenJDK和安装JDK1.8的相关资料,需要的朋友可以参考下
    2024-07-07
  • 解决mybatis中order by排序无效问题

    解决mybatis中order by排序无效问题

    这篇文章主要介绍了解决mybatis中order by排序无效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java读取Properties文件几种方法总结

    Java读取Properties文件几种方法总结

    这篇文章主要介绍了 Java读取Properties文件几种方法总结的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java函数式编程(十二):监控文件修改

    Java函数式编程(十二):监控文件修改

    这篇文章主要介绍了Java函数式编程(十二):监控文件修改,本文是系列文章的第12篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下
    2014-09-09
  • SpringCloud集成Nacos的使用小结

    SpringCloud集成Nacos的使用小结

    这篇文章主要介绍了SpringCloud集成Nacos的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java中的内存泄露问题和解决办法

    Java中的内存泄露问题和解决办法

    大家好,本篇文章主要讲的是Java中的内存泄露问题和解决办法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • java计算代码段执行时间的详细代码

    java计算代码段执行时间的详细代码

    java里计算代码段执行时间可以有两种方法,一种是毫秒级别的计算,另一种是更精确的纳秒级别的计算,这篇文章主要介绍了java计算代码段执行时间,需要的朋友可以参考下
    2022-08-08
  • springboot+gradle 构建多模块项目的步骤

    springboot+gradle 构建多模块项目的步骤

    这篇文章主要介绍了springboot+gradle 构建多模块项目的步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论