synchronize和lock怎么选择(5分钟搞清楚Synchronized和Lock的概念与区别)
synchronize和lock怎么选择(5分钟搞清楚Synchronized和Lock的概念与区别)
2024-11-22 12:28:30  作者:一字轻毫  网址:https://m.xinb2b.cn/tech/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-22广西贵港发力工业广西人大代表、中共贵港市委书记李新元接受中新网记者专访杨志雄摄广西人大代表、中共贵港市委书记李新元接受中新网记者专访杨志雄摄中新网南宁1月29日电(记者林艳华)“我们正大力发展新能源汽车及电动车、电子。
  • rcep对我们有何意义(RCEP成功签署有何重大意义)
  • 2024-11-22RCEP成功签署有何重大意义2020年11月15日,第四次区域全面经济伙伴关系协定领导人会议顺利举行,东盟十国以及中国、日本、韩国、澳大利亚、新西兰15个国家,正式签署区域全面经济伙伴关系协定(RCEP),标志着全球规模最大的自。
  • 总结三极管的正确判别及测量方法(秒懂三极管测量)
  • 2024-11-22秒懂三极管测量三极管测量是很多初入门朋友的难题,三极管测量也因此成为不可避免的话题之一对于三极管测量,它的难度不在于测量步骤有多复杂,而在于三极管测量往往针对类型不同而存在一定差异本文中,小编将向大家介绍贴片三极管。
  • be动词用法和例题(be动词的用法记忆口诀)
  • 2024-11-22be动词的用法记忆口诀be动词是英语中最常见的动词,它常用来描述某人或某事物的性质、状态、特征等等它的含义可以理解为“是”,当我们想要表达某人或某事物“是…的样子”时,便可以用be动词be动词的用法be动词有三种形式∶am。
  • 如何做肉末花椰菜(肉末花椰菜简单做法)
  • 2024-11-22肉末花椰菜简单做法食材:花椰菜300g,肉末60g,蒜片10g,姜末2g,葱花5g,料酒5g,盐1g,酱油15g,糖2g,香油3g,食用油15g菜花切成一口大小,准备好肉末,姜切末,葱切葱花炒锅烧热,加入食用油,先将肉。
  • 张学友经典歌曲精选15首合集(十全十美-066)
  • 2024-11-22十全十美-066上期精彩:「十全十美」-065||巫启贤的十大经典歌曲「十全十美」-066||张学友的十首经典歌曲「十全十美」专题合集:合集:「十全十美」音乐十大串烧专题精选辑||好物分享-16往期精彩:音乐专题:「。
  • 全身瘙痒的原因及解决办法(身上痒找不到原因)
  • 2024-11-22身上痒找不到原因身上好痒!怎么越挠越痒呢?怎么才能更好止痒?我们一起来了解一下十种最常见的瘙痒原因,以及对症的止痒方法1、晒伤晒伤也会加速炎症反应,导致瘙痒止痒处方:冷敷和芦荟凝胶、可的松软膏有助于缓解炎症2、皮肤干。
  • 手链编织桂花结教程(超简单桂花结红绳手链编织教程)
  • 2024-11-22超简单桂花结红绳手链编织教程这次的手链比较简单,就是一个桂花结加一点绕线和一个纽扣结本来是想说直接教大家做桂花结的,但是单做一个结还不如学习下它的应用,所以就直接做成了手链刚开始收尾想做平结抽拉的,试了一下,后面4根5号线绑在一。
  • 南京金茂国际高楼:500米
  • 2024-11-22南京金茂国际高楼:500米500米限高令发布之后,全国规划及在建中的超高层项目全部进行了降高处理,南京受到波及的江北绿地金融中心(原高度600米)和河西鱼嘴金融中心(580米)也全部调整为500米最近,鱼嘴金融中心的设计方AS。
  • 好看搞笑经典的穿越小说(五本穿越玄幻搞笑小说熬夜看停不下来)
  • 2024-11-22五本穿越玄幻搞笑小说熬夜看停不下来大家好欢迎进来阅读此文点关注不迷路,今天给大家推荐五本穿越玄幻小说,特别第三本一路看到结尾个人感觉没有“”蹦”两本完结还有三本没完结我都是养十几章继续又看,有兴趣可以搜搜看第34本头条也可以听且免费,。
  • 手机无线打印用什么软件好(手机的隔空打印)
  • 2024-11-22手机的隔空打印很多人应该都试过急需打印的时候,身边却没有电脑这种情况吧?只用手机怎么打印呢?苹果手机有一个叫“隔空打印”功能,急需打印的时候不需要开电脑也不必将照片或文件传到电脑,就可以打印,下面我们来了解一下这个。
  • 世界最大岛格陵兰(世界最大的岛屿)
  • 2024-11-22世界最大的岛屿世界上有四种比较出名的雪撬犬,分别是西伯利雪撬犬,也就是我们经常说的哈士奇,二哈还有阿拉斯加雪撬犬,爱斯基摩犬,最后一种就是格陵兰犬前面两种雪橇犬已经被驯化成宠物,我们日常生活中经常能看到爱斯基摩犬在。