服务粉丝

我们一直在努力
当前位置:首页 > 科技 >

Java高级编程——Lock 锁的高级用法

日期: 来源:Java高并发框架收集编辑:线程

Java 5 中引入了新的锁机制——java.util.concurrent.locks 中的显式的互斥锁:Lock 接口,

它提供了比 synchronized 更加广泛的锁定操作。 Lock 接口有 3 个实现它的类:ReentrantLock、ReetrantReadWriteLock.ReadLock 和 ReetrantReadWriteLock.WriteLock,即重入锁、读锁和写锁。 lock 必须被显式地创建、锁定和释放,为了可以使用更多的功能,一般用 ReentrantLock 为其实例化。为了保证锁最终一定会被释放(可能会有异常发生),要把互斥区放在 try 语句块内,并在 finally 语句块中释放锁,尤其当有 return 语句时,return 语句必须放在 try 字句中,以确保 unlock()不会过早发生,从而将数据暴露给第二个任务。因此,采用 lock 加锁和释放锁的一般形式如下://默认使用非公平锁,如果要使用公平锁,需要传入参数trueLock lock = new ReentrantLock();lock.lock(); try { // 更新对象的状态 // 捕获异常,必要时恢复到原来的不变约束 // 如果有return语句,放在这里 } finally { //锁必须在finally块中释放lock.unlock();}

可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。 在JAVA环境下 ReentrantLock 和 synchronized 都是可重入锁。ReentrantReadWriteLock

读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。 如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。 总之,读的时候上读锁,写的时候上写锁!

ReentrantReadWriteLock 会使用两把锁来解决问题,一个读锁,一个写锁线程进入读锁的前提条件没有其他线程的写锁没有写请求或者有写请求,但调用线程和持有锁的线程是同一个线程进入写锁的前提条件没有其他线程的读锁没有其他线程的写锁StampedLock

StampedLock 是 java 8 在 java.util.concurrent.locks 新增的一个API。

ReentrantReadWriteLock 在沒有任何读锁和写锁时,才可以取得写入锁,这可用于实现了悲观读取。 然而,如果读取很多,写入很少的情况下,使用 ReentrantReadWriteLock 可能会使写入线程遭遇饥饿问题,也就是写入线程无法竞争到锁定而一直处于等待状态。 StampedLock 有三种模式的锁,用于控制读取/写入访问,StampedLock 的状态由版本和模式组成。 锁获取操作返回一个用于展示和访问锁状态的票据(stamp)变量,它用相应的锁状态表示并控制访问,数字0表示没有写锁被授权访问。 在读锁上分为悲观锁和乐观锁,锁释放以及其他相关方法需要使用邮戳(stamps)变量作为参数,如果他们和当前锁状态不符则失败,这三种模式为:写入:方法writeLock可能为了获取独占访问而阻塞当前线程,返回一个stamp变量,能够在unlockWrite方法中使用从而释放锁。也提供了tryWriteLock。 当锁被写模式所占有,没有读或者乐观的读操作能够成功。读取:方法readLock可能为了获取非独占访问而阻塞当前线程,返回一个stamp变量,能够在unlockRead方法中用于释放锁。也提供了tryReadLock。乐观读取:方法 tryOptimisticRead 返回一个非 0 邮戳变量,仅在当前锁没有以写入模式被持有。如果在获得stamp变量之后没有被写模式持有,方法validate将返回true。 这种模式可以被看做一种弱版本的读锁,可以被一个写入者在任何时间打断。乐观读取模式仅用于短时间读取操作时经常能够降低竞争和提高吞吐量。悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。 Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

相关阅读

  • 高新区考察团赴北京考察对接合作项目

  • 平报融媒记者高轶鹏 通讯员刘晓洁1月6日,高新区管委会副主任、二级调研员唐巍巍,区党工委委员、管委会副主任王学强带领区科技创新局相关负责同志组成考察团,先后到北京瀚中睿
  • 金价涨跌就看今晚!

  • 本文为中国黄金网原创文章,内容仅供参考之用,不构成操作建议或投资指南。2022年12月货币政策会议纪要公布后,美联储官员整体表示维持加息确有必要,并仍试图达成2%的通胀目标,最新
  • 临淄:乘“云”而上 跑出新动能加速度

  • 临淄融媒讯 8毫秒是什么概念呢?“我们在网上下载一个电影,原先进度圈需要转两圈,那可能现在你一眨眼就下载完毕。”12月15日,在山东爱特云翔信息技术有限公司大数据产业园,招商运

热门文章

  • OPPO k1的低价高配真实么?网友:不看不知道

  • 近日OPPO一款新机OPPO k1,摒弃了高价低配,就连自家老大哥r17都要怼一下。更是放弃了请代言人,以往的OPPO手机还没出来,各路流量小生,花样美男的代言就先来了。还有线下销售人员的
  • 一招教你手机无限制成为一台新设备

  • 大家平时用手机去注册app,肯定会遇到检测设备异常,交易关闭,等问题 这个都是手机已经不止1-2次注册过此app,不断更换手机仅是一个暂时的方法,却不是长久之计,手机总归会用完
  • 从零开始如何开网店

  • 随着互联网的高速发展,人们的生活发生了翻天覆地的变化,生活节奏越来越快,网购已经成为家家户户生活中离不开的一种购物方式了。网购的发展使得越来越多的人想要涉足电商事业,那

最新文章

  • 索尼官微被处理

  • 1月4日晚认证为“索尼(中国)有限公司官方微博”的账号@索尼中国被禁言其账号页面则显示“因违反相关法律法规,该用户目前处于禁言状态”别有用心的设计绝非巧合有网友指出2022
  • “加油”福袋送国考考生,宁波再次暖“出圈”

  • 贴心的福袋里满藏着宁波对考生的祝福。1月8日上午,在宁波的国考考点,宁波人社部门推出一波福袋派送活动,助力考生旗开得胜。“加油”福袋内含定制口罩、地铁票、天一阁门票、宁
  • 正式通车!河北新增1处收费站

  • 1月8日,黄石高速公路辛集东收费站正式通车。黄石高速辛集东互通工程位于旧城镇西侧,距黄石高速辛集出口15公里,距黄石高速深州出口14公里,是辛集市2022年民生实事之一。工程主线
  • 雨夹雪+雪!全省将迎雨雪,未来三天……

  • 三九四九冰上走明天将进入三九的第一天数九寒天的最冷时段就要到来了↓↓↓冷空气将接连登场进入新的一周,我省冷空气将接连登场,气温跌跌不休,逐步被打回原形,数九寒天的“寒”