Java 并发编程不可不知的七种锁类型与注意事项
锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。锁是解决并发冲突的重要工具。在开发中我们会用到很多类型的锁,每种锁都有其自身的特点和适用范围。需要深刻理解锁的理念和区别,才能正确、合理地使用锁。
常用锁类型
乐观锁与悲观锁
悲观锁对并发冲突持悲观态度,先取锁后访问数据,能够较大程度确保数据安全性。
而乐观锁认为数据冲突的概率比较低,可以尽可能多地访问数据,只有在最终提交数据进行持久化时才获取锁。
悲观锁总是先获取锁,会增加很多额外的开销,也增加了死锁的几率。尤其是对于读操作,不会修改数据,使用悲观锁大大增加系统的响应时间。
乐观锁最后一步才提交数据,死锁的几率比较低,但是如果有多个事务同时处理相同数据也有几率会冲突甚至导致系统异常。
传统关系型数据库常常使用悲观锁,以提高数据安全性。使用乐观锁的场景,通常用版本号来确保数据安全。
自旋锁
自旋锁会让处于等待状态的线程执行空循环一段时间,执行完空循环后如果能够获取锁就立即获取锁,否则才挂起线程。
使用自旋锁,能够降低等待线程被挂起的概率。线程进入阻塞状态再次唤醒,需要在用户态和内核态之间进行切换,自旋锁避免了进入内核态,因此有比较好的性能。
自旋锁适用于竞争不激烈且线程任务执行时间短的场景。但是对于竞争激烈或者任务执行时间长的场景,不适合使用自旋锁,否则会浪费 CPU 时间片。
重入锁
Java 中提供的可重入锁 ReentrantLock,是一种递归无阻塞的同步机制,可以在外层方法已经加锁的情况下,让内层方法再次获取锁。
ReentrantLock 维护了一个计数器,每加锁一次计数器加一,解锁一次计数器减一。Java 中的 synchronized 也是一种可重入锁。
轮询锁与定时锁
轮询锁是通过线程不断尝试获取锁来实现的,可以避免发生死锁,可以更好地处理错误场景。Java 中可以通过调用锁的 tryLock 方法来进行轮询。tryLock 方法还提供了一种支持定时的实现,可以通过参数指定获取锁的等待时间。如果可以立即获取锁那就立即返回,否则等待一段时间后返回。
读写锁
读写锁 ReadWriteLock 可以优雅地实现对资源的访问控制,具体实现为 ReentrantReadWriteLock。读写锁提供了读锁和写锁两把锁,在读数据时使用读锁,在写数据时使用写锁。
读写锁允许有多个读操作同时进行,但只允许有一个写操作执行。如果写锁没有加锁,则读锁不会阻塞,否则需要等待写入完成。
对象锁与类锁
能锁对象,就不要锁定类,尽量控制范围。锁定类以后,所有的线程使用同一把锁,同一时刻只有一个线程可以加锁;而锁定对象,可以增加锁的数量,提高并发的效率。
注意事项
锁的公平性
大部分锁都支持设置公平性:公平锁是指按照线程等待的时间来决定哪个线程先获取锁,非公平锁是指随机选择一个线程来获取锁。重入锁和读写锁默认都是非公平锁,也可以通过参数来设置。使用时需要根据具体场景来决定设置公平或非公平。
锁消除
如无必要,不要使用锁。Java 虚拟机也可以根据逃逸分析判断出加锁的代码是否线程安全,如果确认线程安全虚拟机会进行锁消除提高效率。
锁粗化
如果一段代码需要使用多个锁,建议使用一把范围更大的锁来提高执行效率。Java 虚拟机也会进行优化,如果发现同一个对象锁有一系列的加锁解锁操作,虚拟机会进行锁粗化来降低锁的耗时。
以上就是一些常见的锁型,获取更多的知识详解和方法,可以私信评论我,大家一起学习进步!

教你“强人锁男”——java并发编程的常用锁类型相关推荐

  1. Java并发编程,无锁CAS与Unsafe类及其并发包Atomic

    为什么80%的码农都做不了架构师?>>>    我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其 ...

  2. 学习笔记:Java 并发编程④_无锁

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  3. 【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )

    文章目录 一.悲观锁 二.乐观锁 三.乐观锁 CAS 三大问题 一.悲观锁 假设有 222 个线程 , 线程 A 和 线程 B ; 线程 A 访问共享资源 , 线程 B 等待 , 一旦线程 A 访问结 ...

  4. JAVA并发编程:悲观锁与乐观锁

    生活 晴. 悲观与乐观的情绪概念 本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚: 悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展. 乐观:对世事怀 ...

  5. Java并发编程实战——显示锁

    显示锁 1.1 Lock与ReentrantLocksynchronized 的局限性 与 Lock 的优点 内置锁的局限性:1.无法中断一个正在等待获取锁的线程: 2. 无法在请求获取一个锁时无限地 ...

  6. 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )

    文章目录 一.悲观锁示例 ( ReentrantLock ) 二.重量级锁弊端 三.锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) 四.锁的四种状态之间的转换 ( 无锁状态 - ...

  7. 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )

    文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...

  8. Java 并发编程之内置锁 synchronized

    synchronized 是Java 提供的内置锁机制,可以用在代码块上,也可以直接用在方法上. 这里有两个概念,锁对象,和代码块. synchronized锁的是对象,任意一个Java 对象都可以作 ...

  9. java并发编程中常用的工具类 Executor

    /***************************************************  * TODO: description .  * @author: gao_chun  * ...

最新文章

  1. 一文了解什么是指数族分布
  2. android虚拟机下载地址,12bet备用网址「永久地址0365.tv」android虚拟机下载在虚拟机中安装Android 操作系统...
  3. 使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
  4. 互联网1分钟 |0102
  5. Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息
  6. 【英语天天读】I want I do I get
  7. Oracle 数据怎么实时同步到 PgSQL | 亲测干货分享建议收藏
  8. php学生分班,学生分班工具下载
  9. vsphere通用配置_vSphere各版本功能对比及简介
  10. 用c语言将学生系统插入音效,增加音效.cpp
  11. com组件 的劫持_2345.com/365j.com的IE首页劫持手动修复方法+修复工具
  12. 【中间件安全】IIS6安全加固规范
  13. 使用Photoshop分解gif
  14. pojo和vo的含义
  15. SOHUDBA/SOHU-DBProxy: 搜狐公司强大的数据库中间件
  16. 破解无线路由器,获得微信等上网信息
  17. ChemOffice Suite 2018 18.1.2.18
  18. 莫尔斯码(Morse Code)
  19. jQuery——遍历
  20. 正则表达式判断是否符合USD格

热门文章

  1. 计算机表格增加,电脑中给Excel表格添加水印效果的方法
  2. 怎么样用阿里云RDS数据库
  3. python 跨知乎app发私信以及Python专栏30万用户信息爬取
  4. 知乎APP使用 产品体验报告
  5. 好不容易说明白AQS,面试官却还要我说应用场景,我只好又讲了CountDownLatch ~~~
  6. win7不显示移动硬盘_如何在移动硬盘中安装win10系统?
  7. 铁矿石再度领跌商品,LPG认沽上涨3倍,MTO季节性上涨2022.6.22
  8. mavell 7040使用方法
  9. linux cp 性能,linux性能监控以及优化之CPU
  10. Logback日志名和日志内容配置增加ip等信息