synchronize和lock怎么选择(5分钟搞清楚Synchronized和Lock的概念与区别)
synchronize和lock怎么选择(5分钟搞清楚Synchronized和Lock的概念与区别)
2024-11-22 05:38:16  作者:一字轻毫  网址:https://m.xinb2b.cn/life/gyu531371.html
前言

并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。


Synchronized 和 Lock的概念

Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized 的目的是一次只允许一个线程进入由他修饰的代码段,从而允许他们进行自我保护。Synchronized 很像生活中的锁例子,进入由Synchronized 保护的代码区首先需要获取 Synchronized 这把锁,其他线程想要执行必须进行等待。Synchronized 锁住的代码区域执行完成后需要把锁归还,也就是释放锁,这样才能够让其他线程使用。

Lock 是 Java并发编程中很重要的一个接口,它要比 Synchronized 关键字更能直译"锁"的概念,Lock需要手动加锁和手动解锁,一般通过 lock.lock() 方法来进行加锁, 通过 lock.unlock() 方法进行解锁。与 Lock 关联密切的锁有 ReetrantLock 和 ReadWriteLock。

ReetrantLock 实现了Lock接口,它是一个可重入锁,内部定义了公平锁与非公平锁。

ReadWriteLock 一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作。ReentrantReadWirteLock实现了ReadWirteLock接口,并未实现Lock接口。


Synchronized 和 Lock 的使用

Synchronized 和 Lock 的使用:

下面是 Synchronized 的例子:

在方法上使用 Synchronized

方法声明时使用,放在范围操作符之后,返回类型声明之前。即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候。

private int number;public synchronized void numIncrease(){ number ;}

在某个代码段使用 Synchronized

你也可以在某个代码块上使用 Synchronized 关键字,表示只能有一个线程进入某个代码段。

public void numDecrease(Object num){ synchronized (num){ number ; }}

使用 Synchronized 锁住整个对象

synchronized后面括号里是一对象,此时线程获得的是对象锁。

public void test() { synchronized (this) { // ... }}

下面是 Lock 的例子:

Lock是一个接口,它主要由下面这几个方法

public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition();}

对上面 Lock 接口的方法做一个简单的解释:

lock(): lock 方法可能是平常使用最多的一个方法,就是用来获取锁。如果锁被其他线程获取,则进行等待。

如果采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁。

Lock lock = ...;lock.lock();try{ //处理任务}catch(Exception ex){ }finally{ lock.unlock(); //释放锁}

tryLock() :方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。

tryLock(long time, TimeUnit unit) 方法和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。

Lock lock = ...;if(lock.tryLock()) { try{ //处理任务 }catch(Exception ex){ }finally{ lock.unlock(); //释放锁 }}else { //如果不能获取锁,则直接做其他事情}

lockInterruptibly() : 此方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就是说,当两个线程同时通过 lock.lockInterruptibly() 想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用 threadB.interrupt() 方法能够中断线程B的等待过程。

由于 lockInterruptibly() 的声明中抛出了异常,所以 lock.lockInterruptibly() 必须放在try块中或者在调用lockInterruptibly() 的方法外声明抛出 InterruptedException。一般形式如下:

public void method() throws InterruptedException { lock.lockInterruptibly(); try { //..... } finally { lock.unlock(); }}

一般来说,使用Lock必须在try{}catch{}块中进行,并且将释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。

注意,当一个线程获取了锁之后,是不会被interrupt()方法中断的。因为本身在前面的文章中讲过单独调用interrupt()方法不能中断正在运行过程中的线程,只能中断阻塞过程中的线程。因此当通过lockInterruptibly()方法获取某个锁时,如果不能获取到,只有进行等待的情况下,是可以响应中断的。而用synchronized修饰的话,当一个线程处于等待某个锁的状态,是无法被中断的,只有一直等待下去。


Synchronized 和 Lock 的主要区别

Synchronzied 和 Lock 的主要区别如下:

存在层面:Syncronized 是Java 中的一个关键字,存在于 JVM 层面,Lock 是 Java 中的一个接口锁的释放条件:1. 获取锁的线程执行完同步代码后,自动释放;2. 线程发生异常时,JVM会让线程释放锁;Lock 必须在 finally 关键字中释放锁,不然容易造成线程死锁锁的获取: 在 Syncronized 中,假设线程 A 获得锁,B 线程等待。如果 A 发生阻塞,那么 B 会一直等待。在 Lock 中,会分情况而定,Lock 中有尝试获取锁的方法,如果尝试获取到锁,则不用一直等待锁的状态:Synchronized 无法判断锁的状态,Lock 则可以判断锁的类型:Synchronized 是可重入,不可中断,非公平锁;Lock 锁则是 可重入,可判断,可公平锁锁的性能:Synchronized 适用于少量同步的情况下,性能开销比较大。Lock 锁适用于大量同步阶段:Lock 锁可以提高多个线程进行读的效率(使用 readWriteLock)在竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;ReetrantLock 提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。最后

欢迎大家一起交流,喜欢文章记得关注我,点赞转发哟,感谢支持!

  • 天津有什么好吃的(天津好吃的有什么)
  • 2024-11-23天津好吃的有什么狗不理包子狗不理包子大伙儿毫无疑问也不生疏,拥有百年老的历史时间,它和耳朵眼炸糕、十八街麻花并称之为津门三绝,狗不理包子也是津门三绝之首,狗不理包子外形美观大方,包子褶很均匀,每一个小笼包都不容易低于。
  • 珍珠奶茶里的珍珠是用什么做的
  • 2024-11-23珍珠奶茶里的珍珠是用什么做的珍珠奶茶的珍珠可以用地瓜粉制作,也可以用木薯粉制作地瓜粉就是从地瓜中提取的淀粉,木薯粉就是从热带植物树薯的块根中提炼出的淀粉,这两种淀粉都具有一定的粘性,做出的珍珠Q弹爽滑,口感更好珍珠的做法如下:1。
  • 华为无线耳机freebuds3和普通版(返程开工的仪式感)
  • 2024-11-23返程开工的仪式感时间飞快,春节假期已经结束许多小伙伴已经返程或正在返程途中,然后开启新一年的奋斗新年新气象,不妨送自己一份充满仪式感的开工、开学礼物华为FreeBuds系列TWS耳机让你归途乐趣更多,更助你在新一年的。
  • 体味文化教学设计方案(教学设计意象之美)
  • 2024-11-23教学设计意象之美从意象到情感,如何从诗词中提炼出作者最真实的情感表达?刘祝君和任娅两位老师通过三篇古诗词《归园田居(其一)》、《诗经·采薇(节选)》、《江雪》,以群文阅读的方式,构建诗歌中的意象组合来学习感知诗词中的。
  • 深圳旅游免费景点推荐(深圳这18个游玩地)
  • 2024-11-23深圳这18个游玩地*定格深圳·游玩第167期*等疫情结束最想的就是带家人一起出门玩一玩嘻嘻给小伙伴们整理了一份「深圳适合全家人一起出行的游玩地」攻略先带大家来一场“云打卡”~​深圳的景点非常多公园更是有1000座其中有。
  • 变成普惠性幼儿园有什么好处?你了解什么是普惠性幼儿园吗
  • 2024-11-23变成普惠性幼儿园有什么好处?你了解什么是普惠性幼儿园吗“普惠性幼儿园”是一个新生概念,它至少包括三个类型的幼儿园:一是公办幼儿园;二是集体或单位举办的公办性质幼儿园;三是提供普惠性服务的民办幼儿园普惠性幼儿园一般注重园所安全、用房配置、户外场地、设施设备。
  • 生日免单攻略广州2023(免单5折买一送一)
  • 2024-11-23免单5折买一送一广州生日福利大放送每年的生日,如何庆祝是个难题在广州生日该去哪里庆祝?下面整理了25家广州生日福利攻略赶紧收藏好!每年生日吃起来!免单、5折、买一送一生日当天带上身份证就可以享受啦其中大部分都是需要免。
  • 学习工业机器人要多久(想要学习工业机器人的你需要了解这些)
  • 2024-11-23想要学习工业机器人的你需要了解这些这一次的疫情让人们切实感受到了机器人产业所爆发的潜能,工业机器人将人们从重复性的工作中剥离而出,降低人类在疫情中的危险系数与此同时复工复产人员聚集风险是防控难点,而依托智能化升级建设的智能工厂以机器人。
  • nba的篮球规则是什么样(NBA不断修改篮球规则)
  • 2024-11-23NBA不断修改篮球规则今年是2021年,NBA成立的第75年,三分球被引入的第42年在这70多年里,NBA逐渐发展和壮大他们一路前行,最终成为全世界最赚钱的体育联盟之一毫无疑问,NBA的商业开发,对比赛精彩度的把握,都是全。
  • 今麦郎是什么企业(被质疑是日资企业)
  • 2024-11-23被质疑是日资企业来源:河南广电-映象网前不久,央视315晚会上曝光的“土坑酸菜”事件引发网友热议,随后,康师傅、统一等各大涉事厂商相继发布道歉和各种声明今日,一则#今麦郎再发声#的话题登上微博热搜,引发广泛热议3月2。
  • 诚信让生活更美好作文400字(诚信让生活更美好400字作文范文)
  • 2024-11-23诚信让生活更美好400字作文范文现在,人们生活的质量越来越高了,但有的人双眼却被金钱蒙蔽,昧着良心赚着让人唾弃的黑心钱,他们失去了一个人最重要的身份证——诚信!今天早晨,妈妈带我去诚信大厦附近买知了猴转了一圈后,发现有个商人的知了猴。
  • 年轻人都喜欢这个手势(这个手势太暖心)
  • 2024-11-23这个手势太暖心本报6月16日讯(记者陈彦杰通讯员魏晨曦李宝萍)四指向内,拇指弯曲向前轻点两下,办理好户籍业务的聋哑夫妻,用手语向民警表示感谢的时候,民警李宝萍一下子就读懂了他们的意思,同时笑着摆了摆手,仿佛在说:“。