电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

java并發(fā)之Lock接口的深入講解

瀏覽:15日期:2023-12-07 15:24:30
目錄Juc中各種各樣鎖信息synchronized面臨缺點Lock接口Lock最佳實踐:對比 Lock和tryLock的區(qū)別總結(jié)Juc中各種各樣鎖信息

在java的juc包為我們提供了各種各樣的鎖信息。如果細(xì)心來看其大部分都會實現(xiàn)一個名為LOCK的接口信息本文皆在幫你回顧Lock信息;

通過本文你將了解到如下內(nèi)容:

1.Lock和synchronized的對比

2.Lock中常見API的總結(jié)

synchronized面臨缺點

鎖的出現(xiàn)主要是為了保證在并發(fā)訪問共享資源時不出現(xiàn)錯。 在java中如果不考慮性能損耗問題,那么對共享的資源信息加上synchrionzed關(guān)鍵字基本就可以解決大多數(shù)并發(fā)帶來的問題,但是也隨之帶來靈活性和效率上的問題:

 效率方面:

1. 此種情況下鎖的釋放情況較少,很容易到導(dǎo)致一直獨占資源而導(dǎo)致性能的下降。

2. 當(dāng)我們試圖獲取鎖時不能直接指定具體條件

3. 不能中斷正在試圖獲得鎖的線程

靈活性:

1. 當(dāng)獲得鎖資源后,無法得知是否獲得鎖信息

2. 僅當(dāng)程序異常或順利執(zhí)行完時才會釋放鎖信息,缺乏主動釋放鎖的時機。

不適用的場景

場景1 :

當(dāng)我們使用synchronized時,假如某線程獲取到鎖之后由于要等待IO或者其他原因進入阻塞狀態(tài),同時未釋放鎖信息,那么此時其他線程就只能一直等待。所以此時就需要synchronized有一種機制:避免等待的線程一直無期限地等待下去。場景2 :

在讀文件信息形式,不同線程的寫操作是相互沖突的。但是讀操作并不會導(dǎo)致沖突。如果我們不加考慮的為資源信息加上synchronized關(guān)鍵字,那么當(dāng)多線程同時操作時,只有一個線程可以獲取到資源,其他未獲得鎖信息的線程只能進入等待狀態(tài),從而導(dǎo)致讀寫效率不高。

Lock接口

Lock接口是對關(guān)鍵字synchronized的補充和擴展,它允許我們可以在線程安全的情況下更加靈活的操作共享資源信息。

常見用法:

java并發(fā)之Lock接口的深入講解

Lock最佳實踐:

1.lock(),unlock()

一般來說,使用Lock必須在try…catch…塊中進行,并且將釋放鎖的操作放在finally塊中進行。這是因為lock并不會像synchronized那樣在異常時釋放鎖,所以必須保證有手動釋放的過程,這樣才能保證其它線程有獲取鎖的機會。

// 加鎖lock.lock();try{ //處理任務(wù)}catch(Exception ex){​}finally{ //釋放鎖 (鎖的釋放一般放入到finally塊中進行,這樣保證了總會對鎖信息進行釋放) lock.unlock(); }

2. tryLock() & tryLock(long time, TimeUnit unit)

tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true;如果獲取失敗(即鎖已被其他線程獲取),則返回false,也就是說,這個方法無論如何都會立即返回即使其無法獲取到鎖也不會一致等待。

tryLock(long time, TimeUnit unit)方法和tryLock()方法是類似的,只不過區(qū)別在于這個方法在拿不到鎖時會等待一定的時間,在時間期限之內(nèi)如果還拿不到鎖,就返回false

如果一開始拿到鎖或者在等待期間內(nèi)拿到了鎖,則返回true。一般情況下,通過tryLock來獲取鎖時是這樣使用的:

Lock lock = ...;if(lock.tryLock()) { try{ //處理任務(wù) }catch(Exception ex){​ }finally{ lock.unlock(); //釋放鎖 } }else { //如果不能獲取鎖,則直接做其他事情}

3. lockInterruptibly()  

lockInterruptibly()方法比較特殊,當(dāng)通過這個方法去獲取鎖時,如果線程 正在等待獲取鎖,則這個線程能夠 響應(yīng)中斷,即中斷線程的等待狀態(tài)。

例如,當(dāng)兩個線程同時通過lock.lockInterruptibly()想獲取某個鎖時,假若此時線程A獲取到了鎖,而線程B只有在等待,那么對線程B調(diào)用threadB.interrupt()方法能夠中斷線程B的等待過程。

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

當(dāng)一個線程獲取了鎖之后,是不會被interrupt()方法中斷的。因為interrupt()方法只能中斷阻塞過程中的線程而不能中斷正在運行過程中的線程。而在 synchronized 中,當(dāng)一個線程處于等待某個鎖的狀態(tài),是無法被中斷的,只有一直等待下去,這也就是我們需要手動釋放鎖的原因。

給出如下的例子來進行驗證:創(chuàng)建兩個線程來共同爭搶lock鎖信息

public class LockInterruptibly implements Runnable {​ private Lock lock = new ReentrantLock();public static void main(String[] args) { LockInterruptibly lockInterruptibly = new LockInterruptibly(); Thread thread0 = new Thread(lockInterruptibly); Thread thread1 = new Thread(lockInterruptibly); thread0.start();​ try {Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace(); } thread1.start(); thread1.interrupt();} // 任務(wù)執(zhí)行邏輯 @Override public void run() {System.out.println(Thread.currentThread().getName() + '嘗試獲取鎖');try { lock.lockInterruptibly(); try {System.out.println(Thread.currentThread().getName() + '獲取到了鎖');Thread.sleep(5000); } catch (InterruptedException e) {System.out.println(Thread.currentThread().getName() + '睡眠期間被中斷了'); } finally {lock.unlock();System.out.println(Thread.currentThread().getName() + '釋放了鎖'); }} catch (InterruptedException e) { System.out.println(Thread.currentThread().getName() + '獲得鎖期間被中斷了');} }}​

執(zhí)行結(jié)果:

Thread-0嘗試獲取鎖Thread-0獲取到了鎖Thread-1嘗試獲取鎖Thread-1獲得鎖期間被中斷了Thread-0釋放了鎖

通過結(jié)果信息我們可以看出,lockInterruptibly()僅能中斷正在等待的線程信息,而無法中斷正在運行的線程。

對比 Lock和tryLock的區(qū)別

lock和tryLock都可以獲取到鎖信息,但兩者之間還是存在些差異的。 具體如下:

1: lock拿不到鎖會一直等待。tryLock是去嘗試,拿不到就返回false,拿到返回true。

2: tryLock是可以被打斷的,被中斷的,lock是不可以。

// 實例代碼 public class LockDemo implements Runnable{ static Lock lock1 = new ReentrantLock(); @Override public void run() {// 分別演示 lock,trylock區(qū)別// lock1.lock();lock1.tryLock();System.out.println('線程 ' + Thread.currentThread().getName() + ' 獲取到鎖信息 '); } public static void main(String[] args) throws InterruptedException {LockDemo r1 = new LockDemo();LockDemo r2 = new LockDemo();r1.flag = true;r2.flag = false;Thread t1 = new Thread(r1);Thread t2 = new Thread(r2);​t1.start();Thread.sleep(1000);// 中斷t2.start();t2.interrupt(); }}​

結(jié)果信息:

當(dāng)執(zhí)行l(wèi)ock1.lock()時的輸出:可以看到lock方法并不能響應(yīng)中斷信息,如果不解鎖則會一致持有鎖信息!

java并發(fā)之Lock接口的深入講解

對于tryLock而言其可以響應(yīng)中斷

java并發(fā)之Lock接口的深入講解

總結(jié)

本篇對Lock接口中常用到的Api進行了分析和總結(jié),同時分析了Lock接口和synchronized關(guān)鍵之間的關(guān)系,希望對你能有所啟發(fā).

到此這篇關(guān)于java并發(fā)之Lock接口的文章就介紹到這了,更多相關(guān)java并發(fā)Lock接口內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 振动时效_振动时效仪_超声波冲击设备-济南驰奥机电设备有限公司 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 不锈钢水管-不锈钢燃气管-卫生级不锈钢管件-不锈钢食品级水管-广东双兴新材料集团有限公司 | AR开发公司_AR增强现实_AR工业_AR巡检|上海集英科技 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 香蕉筛|直线|等厚|弧形|振动筛|香蕉筛厂家-洛阳隆中重工 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | 金联宇电缆|广东金联宇电缆厂家_广东金联宇电缆实业有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 合肥注册公司|合肥代办营业执照、2024注册公司流程 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 |