公平锁、非公平锁:公平锁指多个线程按照申请锁的顺序来获取锁,非公平锁就是没有顺序完全随机,所以能会造成优先级反转或者饥饿现象;synchronized 就是非公平锁,ReentrantLock(使用 CAS 和 AQS 实现) 通过构造参数可以决定是非公平锁还是公平锁,默认构造是非公平锁;非公平锁的吞吐量性能比公平锁大好。

可重入锁:又名递归锁,指在同一个线程在外层方法获取锁的时候在进入内层方法会自动获取锁,synchronized和 ReentrantLock 都是可重入锁,可重入锁可以在一定程度避免死锁。

独享锁、共享锁:独享锁是指该锁一次只能被一个线程持有,共享锁指该锁可以被多个线程持有;synchronized和 ReentrantLock 都是独享锁,ReadWriteLock的读锁是共享锁,写锁是独占锁;ReentrantLock 的独享锁和共享锁也是通过 AQS 来实现的。

互斥锁、读写锁:其实就是独享锁、共享锁的具体说法;互斥锁实质就是 ReentrantLock,读写锁实质就是 ReadWriteLock。

乐观锁、悲观锁:这个分类不是具体锁的分类,而是看待并发同步的角度;悲观锁认为对于同一个数据的并发操作一定是会发生修改的(哪怕实质没修改也认为会修改),因此对于同一个数据的并发操作悲观锁采取加锁的形式,因为悲观锁认为不加锁的操作一定有问题;乐观锁则认为对于同一个数据的并发操作是不会发生修改的,在更新数据的时候会采用不断的尝试更新,乐观锁认为不加锁的并发操作是没事的;由此可以看出悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升,悲观锁在Java 中很常见,乐观锁其实就是基于 CAS 的无锁编程,譬如 java 的原子类就是通过 CAS 自旋实现的。

分段锁:实质是一种锁的设计策略,不是具体的锁,对于 ConcurrentHashMap 而言其并发的实现就是通过分段锁的形式来实现高效并发操作;当要 put 元素时并不是对整个 hashmap 加锁,而是先通过 hashcode 知道它要放在哪个分段,然后对分段进行加锁,所以多线程 put 元素时只要放在的不是同一个分段就做到了真正的并行插入,但是统计 size 时就需要获取所有的分段锁才能统计;分段锁的设计是为了细化锁的粒度。

偏向锁、轻量级锁、重量级锁:这种分类是按照锁状态来归纳的,并且是针对 synchronized 的,java 1.6 为了减少获取锁和释放锁带来的性能问题而引入的一种状态,其状态会随着竞争情况逐渐升级,锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后无法降为偏向锁,这种升级无法降级的策略目的就是为了提高获得锁和释放锁的效率。

自旋锁:其实是相对于互斥锁的概念,互斥锁线程会进入 WAITING 状态和 RUNNABLE 状态的切换,涉及上下文切换、cpu 抢占等开销,自旋锁的线程一直是 RUNNABLE 状态的,一直在那循环检测锁标志位,机制不重复,但是自旋锁加锁全程消耗 cpu,起始开销虽然低于互斥锁,但随着持锁时间加锁开销是线性增长。

可中断锁:synchronized 是不可中断的,Lock 是可中断的,这里的可中断建立在阻塞等待中断,运行中是无法中断的。

java锁的有哪些_「并发编程」Java锁分类和特点有哪些相关推荐

  1. java雪崩_【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)...

    [并发编程]java 如何解决redis缓存穿透.缓存雪崩(高性能示例代码) 发布时间:2018-11-22 16:48, 浏览次数:872 , 标签: java redis <>缓存穿透 ...

  2. docker php composer 使用_「PHP编程」如何使用Docker制作自己的LNMP/LAMP镜像

    LNMP和LAMP是PHP常用的两种运行环境,L代表Linux,N代表Nginx,A代表Apache,M代表Mysql,P代表PHP.在文章<「PHP编程」安装开发环境太烦?告诉你几个简单方法, ...

  3. composer 安装dev包_「PHP编程」如何搭建私有Composer包仓库?

    在前一篇文章「PHP编程」如何制作自己的Composer包?中,我们已经介绍了如何制作自己的 composer 包,以及如何使用 composer 安装自己制作的 composer 包.不过,这其中有 ...

  4. java交易撮合怎么实现_「康力电梯002367」“股票实时交易系统如何实现高并发撮合交易?最好有java架构“java 股票分析工具-京东方a小-seo金融...

    本文由京东方a小编创作于2020-09-10 21:11:04发布的来源于seo金融股票配资http://www.drill-pipe.com/gov/52833.html请您欣赏.seo金融网拥有众 ...

  5. java模拟数据库压测_写并发压测 java 脚本你必须会的 3 个类

    性能测试做到后面,一些特殊的场景利用常用的现成工具满足不了需求,所以你需要学习java写一些特定协议的压测脚本,那你不得不研究多线程或线程池,而此时你也一定会遇到java并发编程中的几个类,今天重点讲 ...

  6. oracle 锁表如何解决_「技术分享」高并发下的接口幂等性解决方案

    高并发下的接口幂等性解决方案! 一.背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果.我们发起 ...

  7. java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令

    作为服务端开发的同学,经常会与linux服务器打交道,一些用的命令必须要掌握. 1.top命令-观察服务端负载情况 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况 ...

  8. arraylist java 排序_「arraylist排序」java ArrayList的两种排序方法 - seo实验室

    arraylist排序 1.ArrayList使用排序的初衷 我们知道ArrayList的好处是可以不用限定容器的大小,他会根据元素的增加自己扩大.但是存储进去的数据类型都会变成object,虽然每个 ...

  9. 虚拟机的分类_「面试必备」Java虚拟机知识点复习手册(下)

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

最新文章

  1. ffmpeg 移植到 android 并使用
  2. personalization icon is missing in UI
  3. php取key的value值,获取数组中key和value的值
  4. 从数据库层面手动删除zabbix告警
  5. 卷积神经网络——第一周 卷积神经网络基础——第二部分
  6. Python Profiler 列举
  7. 使用extundelete恢复测试liunx的删除文件
  8. 在苹果Mac中将 WEBP 图片转成 JPG、PNG 格式的 2 种方法
  9. 宏电7710与组态王通信配置
  10. 大学英语(第一册)复习(原文及全文翻译)——Unit 5 - A Miserable, Merry Christmas(又悲又喜的圣诞节)
  11. 《人月神话》第十一弹
  12. speechbrain - 小记
  13. 三分钟带你搞懂什么是向上转型和向下转型
  14. MySQL索引(什么是索引、如何创建索引、什么时候用索引、索引的作用)
  15. 费曼:数学与物理学的关系
  16. 使用GEE(Google Earth Engine)下载STRM30m分辨率高程数据
  17. 游戏建模师日常工作内容包括哪些?
  18. 全国计算机二级web考试试题,全国计算机二级Web模拟试题及答案(1)
  19. 中兴a2018刷android,中兴A2018刷机教程_中兴A2018 天机7S卡刷升级更新官方系统
  20. NOKIA5110 LCD使用心得之坐标与字模(多原理少代码版)

热门文章

  1. quartz异常:Couldn't rollback jdbc connection
  2. 新手搭建简洁的Express-React-Redux脚手架
  3. 通过sql语句对MySql数据库的基本操作
  4. iptables7层过滤,屏蔽(QQ,MSN,迅雷,PPTV等)
  5. 自动化运维工具之puppet简单实用
  6. 液体冷却将在数据中心重现
  7. VMware CTO:未来VMware NSX与思科ACI将有更多整合
  8. 解决应用程序配置不正确,程序无法启动
  9. mac svn 返回svn upgrade等出错
  10. SQL语句小tips(持续更新)