synchronize和lock怎么选择(5分钟搞清楚Synchronized和Lock的概念与区别)
synchronize和lock怎么选择(5分钟搞清楚Synchronized和Lock的概念与区别)
2024-10-01 05:54:31  作者:一字轻毫  网址: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-10-01驾校当教练员要哪些条件驾校教练员分为理论教练员和实操教练员两类国务院取消的从业资格证里面就有教练员从业资格证现在是由驾驶培训机构培训按照教练员标准自行培训、自行考核,到交通运输局驾校科备案后,就可以到驾校入职现如今教练员鱼。
  • 巷口闲人聚柳岸(闲话街坊春似海----豫章十二坊)
  • 2024-10-01闲话街坊春似海----豫章十二坊当时街坊上家家箫管,户户笙歌,当头一轮明月,飞彩凝辉——(清)曹雪芹《红楼梦·第一回》一九二八年是南昌古今城区的分水岭,此年为民国十七年,清朝已灭亡十七年,但古老的城墙尚存清代南昌城区全景清代南昌城区。
  • 白色月光张磊介绍(白色月光张磊饰演谁)
  • 2024-10-01白色月光张磊饰演谁《白色月光》张磊饰演的角色是李景峰剧中李景峰是张鑫的好友,他憨厚正义,在好友有困难的时候两肋插刀,同时又能明辨是非及时止损,引人共鸣,吸粉无数张磊的表演自然细腻,通过简单的语言和恰当的神态表情,把一个。
  • 外国名人故事(都告诉了我们什么道理)
  • 2024-10-01都告诉了我们什么道理英国化学家戴维一位木器雕刻匠的儿子虽然他小时候家境并不富裕,但他却贫穷不改凌云志,坚持刻苦学习,二十岁时就发现了一种能使人发笑不已的气体--笑广七(一氧化二氮),从此闻名于世在进行这次实验时,他差点因。
  • 次北固山下翻译简短(次北固山下原文翻译)
  • 2024-10-01次北固山下原文翻译翻译:旅途在青山外,在碧绿的江水前行舟潮水涨满,两岸之间水面宽阔,顺风行船恰好把帆儿高悬夜幕还没有褪尽,旭日已在江上冉冉升起,还在旧年时分,江南已有了春天的气息寄出去的家信不知何时才能到达,希望北归的。
  • 三里屯太古里实惠美食(三里屯太古里美食地图)
  • 2024-10-01三里屯太古里美食地图刷爆朋友圈的烧饼油条、连鹿晗都要吃的薯条和汉堡、日本开来的全球首创蘸面、用意面做甜品的pasta专营店、巧克力重度患者的天堂、凌晨两点也能买到的网红面包、《好先生》里的爆款惠灵顿牛排、风靡京城会跳舞的。
  • 生活的意义在于你懂得了珍惜(你对生活的意义了解多少)
  • 2024-10-01你对生活的意义了解多少我觉得生活的意义很简单,就是家人和责任不用太多话术去表达,每个人对此的想法理解不同,就好比每个人对幸福的认知都不一样,你觉得呢?三十而立之前,生命总是在模仿,学习,积累,和求索,使生命充实,使人生丰满。
  • 福建小伙天天给妈妈做饭(浙江一男子给全家人做晚餐)
  • 2024-10-01浙江一男子给全家人做晚餐宁波菜是浙菜的一个地方菜系,以咸鲜为主,讲求鲜嫩多汁,一位宁波老公杨宇豪就很会做饭,只要有空就会给老婆和孩子们做饭,是别人口中的好爸爸好老公,但是杨宇豪的妻子陈文婷却不高兴,有时候宁愿煮个面吃也不愿意。
  • 幼儿园设计细节(幼儿园设计方案好看固然重要)
  • 2024-10-01幼儿园设计方案好看固然重要幼儿园设计的特殊性在于幼儿的身心发展阶段和成人不同,每一所幼儿园的教育理念也有区别,幼儿园所处的环境也大不相同,因此从需求沟通到方案落地会受到很多因素的影响△幼儿园户外玩具设计效果图方案好看固然重要,。
  • 美术生最有前景的专业是什么(美术生哪个专业就业前景好)
  • 2024-10-01美术生哪个专业就业前景好美术生就业前景好的专业有:视觉传达设计专业、产品设计专业、游戏设计专业、插画专业、室内设计专业等美术生哪个专业就业前景好1、视觉传达设计视觉传达设计专业也有很多人称为平面设计和广告设计,目前随着电商淘。
  • 关公哪里人
  • 2024-10-01关公哪里人关公是河东郡解县人,也就是现在的山西省运城市盐湖区解州镇人关公即是关羽,其本身是我国三国时期蜀汉势力的著名将领之一,因对刘备的忠义而被世人赞誉,到了明清时期关羽的声誉达到了顶峰,说书唱戏时不许直呼“关。