日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程: ReentrantLock类

發布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程: ReentrantLock类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用ReentrantLock實現同步

? ReentrantLock對象的lock()方法獲取鎖, 調用unlock()方法釋放鎖

? 調用ReentrantLock對象的lock()方法的線程就持有"對象監視器",其他線程只有等待鎖被釋放時再次爭搶。效果和使用synchronized關鍵字一樣。

? ?關鍵字synchronized與wait()和notify()/notifyAll()方法相結合可以實現等待/通知模式, 類ReentrantLock也可以實現同樣的功能,但需要借助于Condition對象。Condition類是再jdk5中出現的技術,使用它有更好的靈活性,比如可以實現多路通知功能。使用ReentrantLock結合Condition類是可以實現"選擇性通知",這個功能非常重要。

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock;public class MySservice {private ReentrantLock lock = new ReentrantLock();private Condition conditionA = lock.newCondition();private Condition conditionB = lock.newCondition();private boolean hasValue = false;public void set(){try {lock.lock();while(hasValue == true){System.out.println("setsetsetset"+Thread.currentThread().getName());conditionA.await();}System.out.println("set");hasValue = true;conditionB.signal();} catch (InterruptedException e) {e.printStackTrace();}finally {lock.unlock();}}public void get(){try {lock.lock();while(hasValue == false){System.out.println("getgetgetget");conditionB.await();}System.out.println("get");hasValue = false;conditionA.signal();} catch (InterruptedException e) {e.printStackTrace();}finally {lock.unlock();}} }public class MyThreadA extends Thread {private MySservice mySservice;public MyThreadA(MySservice mySservice){super();this.mySservice = mySservice;}@Overridepublic void run(){for (int i = 0; i < Integer.MAX_VALUE; i++) {mySservice.set();}} }public class MyThreadB extends Thread {private MySservice mySservice;public MyThreadB(MySservice mySservice){super();this.mySservice = mySservice;}@Overridepublic void run(){for (int i = 0; i < Integer.MAX_VALUE; i++) {mySservice.get();}} }public class Run {public static void main(String[] args) {MySservice mySservice = new MySservice();MyThreadA[] myThreadA = new MyThreadA[10];MyThreadB[] myThreadB = new MyThreadB[10];for (int i = 0; i < 10; i++) {myThreadA[i] = new MyThreadA(mySservice);myThreadB[i] = new MyThreadB(mySservice);myThreadA[i].setName((i+1)+"");myThreadA[i].start();myThreadB[i].start();}} }

方法getHoldCount()

? 該方法是查詢當前線程保持此鎖定的個數,也就是調用lock()方法的次數

import java.util.concurrent.locks.ReentrantLock;public class Service {private ReentrantLock lock = new ReentrantLock();public void serviceMethod1(){try{lock.lock();System.out.println("serviceMethod1 getHoldCount="+lock.getHoldCount());serviceMethod2();}finally {lock.unlock();}}public void serviceMethod2(){try{lock.lock();System.out.println("serviceMethod2 getHoldCount="+lock.getHoldCount());}finally {lock.unlock();}} }public class Run {public static void main(String[] args) {Service service = new Service();service.serviceMethod1();} }

?方法getQueueLength()

??返回正等待獲取此鎖定的線程估計數。

public class Run {public static void main(String[] args) throws InterruptedException {final Service service = new Service();Runnable runnable = new Runnable() {@Overridepublic void run() {service.serviceMethod1();}};Thread[] threadArray = new Thread[10];for (int i = 0; i < 10; i++) {threadArray[i] = new Thread(runnable);}for (int i = 0; i < 10; i++) {threadArray[i].start();}Thread.sleep(2000);System.out.println("有線程樹:"+service.lock.getQueueLength()+"正在等待鎖!");} }import java.util.concurrent.locks.ReentrantLock;public class Service {public ReentrantLock lock = new ReentrantLock();public void serviceMethod1(){try{lock.lock();System.out.println("ThreadName="+Thread.currentThread().getName()+" 進入方法!");Thread.sleep(1000);}catch(InterruptedException ex){ex.printStackTrace();}finally {lock.unlock();}} }

方法hasQueuedThread(), hasQueuedThreads()

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock;public class Service {public ReentrantLock lock = new ReentrantLock();public Condition newCondition = lock.newCondition();public void waitMethod(){try{lock.lock();Thread.sleep(Integer.MAX_VALUE);}catch (InterruptedException ex){ex.printStackTrace();}finally {lock.unlock();}} }public class Run {public static void main(String[] args) throws InterruptedException {final Service service = new Service();Runnable runnable = new Runnable() {@Overridepublic void run() {service.waitMethod();}};Thread threadA = new Thread(runnable);threadA.start();Thread.sleep(500);Thread threadB = new Thread(runnable);threadB.start();Thread.sleep(500);System.out.println(service.lock.hasQueuedThread(threadA));System.out.println(service.lock.hasQueuedThread(threadB));System.out.println(service.lock.hasQueuedThreads());System.out.println(service.lock.getQueueLength());} }

方法isFair()

? ? ?判斷是不是公平鎖

import java.util.concurrent.locks.ReentrantLock;public class Service {private ReentrantLock lock;public Service(boolean isFair){super();lock = new ReentrantLock(isFair);}public void serviceMethod(){try{lock.lock();System.out.println(Thread.currentThread().getName()+" 公平鎖情況:"+lock.isFair());}finally {lock.unlock();}} }public class Run {public static void main(String[] args) {Service service1 = new Service(true);Runnable runnable = new Runnable() {@Overridepublic void run() {service1.serviceMethod();}};Thread t1 = new Thread(runnable,"A");t1.start();Service service2 = new Service(false);Runnable runnable2 = new Runnable() {@Overridepublic void run() {service2.serviceMethod();}};Thread t2 = new Thread(runnable2,"B");t2.start();} }

方法isHeldByCurrentThread()

? 查詢當前線程是否保持此鎖定

import java.util.concurrent.locks.ReentrantLock;public class Service {private ReentrantLock lock;public Service(){super();lock = new ReentrantLock();}public void serviceMethod(){try{System.out.println("當前線程是否保持此鎖定"+lock.isHeldByCurrentThread());lock.lock();System.out.println("當前線程是否保持此鎖定"+lock.isHeldByCurrentThread());}finally {lock.unlock();}} }public class Run {public static void main(String[] args) {final Service service1 = new Service();Runnable runnable = new Runnable() {@Overridepublic void run() {service1.serviceMethod();}};Thread t = new Thread(runnable);t.start();} }

方法tryLock(long timeout, TimeUnit unit)

? ? ?如果鎖定在給定等待時間內沒有被另一個線程保持,且當前線程未被中斷,則獲取該鎖定

import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock;public class MyService {private ReentrantLock lock = new ReentrantLock();public void waitMethod(){try{if(lock.tryLock(3, TimeUnit.SECONDS)){System.out.println(" "+Thread.currentThread().getName()+"獲得鎖的時間:"+System.currentTimeMillis());Thread.sleep(10000);}else{System.out.println(" "+Thread.currentThread().getName()+"沒有獲得鎖");}}catch (InterruptedException ex){ex.printStackTrace();}finally {if(lock.isHeldByCurrentThread()){lock.unlock();}}} }public class Run {public static void main(String[] args) {final MyService service = new MyService();Runnable runnableRef = new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+" 調用waitMethod時間: "+System.currentTimeMillis());service.waitMethod();}};Thread threadA = new Thread(runnableRef);threadA.setName("A");threadA.start();Thread threadB = new Thread(runnableRef);threadB.setName("B");threadB.start();} }

??

總結

以上是生活随笔為你收集整理的线程: ReentrantLock类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美精品一区二区三区 | 可以在线观看的av | 一级做a爰片久久毛片 | 亚洲成人激情在线 | 欧美精品18videosex性欧美 | 精品午夜视频 | www.久久婷婷 | 久久免费黄色 | 久久在线免费观看视频 | 麻豆视频传媒入口 | 亚洲国产视频一区二区三区 | 中国一区二区视频 | 日韩欧美激情在线 | 四虎av在线 | 性一区 | av在线亚洲天堂 | 亚洲人视频 | 欧洲高潮三级做爰 | 午夜免费大片 | 久久久久久久av | 国产又黄又爽 | 亚洲精品1 | 国产性av| 香蕉av一区 | 国产精品人人妻人人爽人人牛 | 日韩人妻无码一区二区三区 | 成人中文字幕在线观看 | 久草欧美 | 午夜日韩在线观看 | 日本一级黄 | 欧美xxxx在线| 自拍偷拍校园春色 | 国产精品麻豆入口 | 欧美日韩激情一区二区 | 色777| 精彩久久| 黄色一级小说 | 9.1在线观看免费 | 国产后入又长又硬 | 国产黄色免费大片 | a天堂中文在线观看 | 苍井空浴缸大战猛男120分钟 | xxx视频网站 | a级黄色小说 | 日本久久免费 | 国产乱码精品一区二区三区五月婷 | 久久久全国免费视频 | 自拍在线视频 | 国产精品不卡在线 | 蜜桃av一区二区三区 | 免费观看视频一区二区 | 亚洲欧美另类日韩 | 国产精品自在线 | 人人妻人人澡人人爽人人欧美一区 | 久久久久久久亚洲精品 | 午夜精品在线免费观看 | 天天干天天爽天天操 | 中国新婚夫妻性猛交 | 一级空姐毛片 | 日韩午夜 | 亚洲国产私拍精品国模在线观看 | 日韩插 | 不卡的日韩av | 在线免费观看www | 国产成人精品综合在线观看 | 老熟女一区二区三区 | 人成午夜 | 亚洲人成电影网站 | 色婷婷国产精品综合在线观看 | 精品丰满人妻无套内射 | 欧美视频观看 | 永久在线观看 | 99久久精品免费看国产交换 | av网站大全在线观看 | 日韩aⅴ在线观看 | 欧美精产国品一二三区 | 怡红院一区二区三区 | 成人午夜视频网站 | 综合久久久| 亚洲av无码乱码在线观看富二代 | 亚洲精品色图 | 国产+高潮+白浆+无码 | 亚洲图片一区二区三区 | 狂野欧美性猛交xxxx巴西 | 成人在线观看a | 在线看亚洲 | 久久免费手机视频 | 欧美成人h | 日本三级吃奶头添泬 | 福利视频不卡 | 成人在线a | 泰坦尼克号3小时49分的观看方法 | 中文字幕一区二区三区乱码不卡 | www日本视频| 黄色小视频在线观看免费 | 天堂成人国产精品一区 | 日韩成人无码影院 | 亚洲精品视频导航 | 麻豆一区二区在线 |