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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AQS理解之二,自己设计一个锁

發(fā)布時間:2024/9/30 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AQS理解之二,自己设计一个锁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AQS理解之二,自己設(shè)計一個鎖

一,實現(xiàn)鎖的條件

首先我們想一想,如果我們自己實現(xiàn)一個類似于java中的鎖,我們可能需要哪些必要的東西:

1,記錄是哪個線程持有了鎖。

2,如果有一個變量代表加鎖,A線程加鎖,需要讓B線程能看見,這里需要可見性,所以我們可能要用到volatile變量。

3,對變量的操作應(yīng)該是一個原子操作。

二,實現(xiàn)

首先我們定義一個類,這個類需要有一個持有鎖的變量。這里使用ownerThread這個變量來代表持有鎖的線程。

class MyLock{private Thread ownerThread;public Thread getOwnerThread() {return ownerThread;}public void setOwnerThread(Thread ownerThread) {this.ownerThread = ownerThread;} }

我們先簡單定義一下加鎖和解鎖的方法。并設(shè)置一個volatile的變量來保證鎖的可見性。

class MyLock{private Thread ownerThread;private volatile int state;public Thread getOwnerThread() {return ownerThread;}public void setOwnerThread(Thread ownerThread) {this.ownerThread = ownerThread;}public boolean lock(){//可重入,如果鎖設(shè)置不可重入,則state應(yīng)該只能為1和0,并在此處拋出異常。if (Thread.currentThread() == getOwnerThread()){//臨時寫法,應(yīng)該為原子操作的++;state++;return true;} else if(state == 0){state++; //這里的判斷相等和++操作不應(yīng)該分開,臨時寫法。正確方法應(yīng)該為CAS操作。setOwnerThread(Thread.currentThread());return true;}return false;}public void unlock(){if (Thread.currentThread() != getOwnerThread()){throw new RuntimeException("不是鎖持有線程,不能解鎖");}state--;setOwnerThread(null);} }

這里我們看到lock里我們考慮到了可重入性,所以簡單實現(xiàn)了一下,如果還要實現(xiàn)lock阻塞,應(yīng)該加上自旋操作,如:

public boolean lock(){//加上自旋,如果失敗,繼續(xù)。for (;;) {if (Thread.currentThread() == getOwnerThread()){state++;return true;}else if(state == 0){state++;setOwnerThread(Thread.currentThread());return true;}} }

我們繼續(xù)完善代碼,將之前的臨時操作進一步優(yōu)化。因為我們無法使用unsafe類來操作,我門這里將state修改為AtomicInteger。

class MyLock{private Thread ownerThread;private volatile AtomicInteger state;public MyLock(){state = new AtomicInteger(0);}public Thread getOwnerThread() {return ownerThread;}public void setOwnerThread(Thread ownerThread) {this.ownerThread = ownerThread;}public boolean lock(){//可重入for (;;) {if (Thread.currentThread() == getOwnerThread()){state.incrementAndGet();return true;}else if(state.compareAndSet(0,1)){setOwnerThread(Thread.currentThread());}}}public void unlock(){if (Thread.currentThread() != getOwnerThread()){throw new RuntimeException("不是鎖持有線程,不能解鎖");}setOwnerThread(null);state.decrementAndGet();} }

三,驗證

public static void testSout(){try{lock.lock();System.out.println("a");Thread.sleep(100);System.out.println("b");Thread.sleep(100);System.out.println("c");Thread.sleep(100);System.out.println("d");Thread.sleep(100);}catch (Exception e){e.printStackTrace();}finally {lock.unlock();} }public static void main(String[] args) throws InterruptedException {Runnable runnable = new Runnable() {@Overridepublic void run() {TestUtil.testSout();}};Thread thread = new Thread(runnable);Thread thread1 = new Thread(runnable);Thread thread2 = new Thread(runnable);Thread thread3 = new Thread(runnable);thread.start();thread1.start();thread2.start();thread3.start();thread.join();thread1.join();thread2.join();thread3.join();}

控制臺可以正常輸出,說明我們加的鎖是可以用的。

四,總結(jié)

在這里我們實現(xiàn)的是一個可重入的,不公平,利用自旋來阻塞的一個鎖,后續(xù)繼續(xù)深入。

總結(jié)

以上是生活随笔為你收集整理的AQS理解之二,自己设计一个锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级片在线观看免费 | 少妇做爰免费视频播放 | 岛国大片在线免费观看 | 国产精品免费视频观看 | 在线观看亚洲专区 | av天堂永久资源网 | 亚洲国产中文字幕在线 | 国产精品网页 | 亚洲自偷自偷偷色无码中文 | 99riav视频 | 精品深夜av无码一区二区老年 | 欧美成人区 | 免费黄色国产 | 在线观看欧美精品 | 在线色站 | 亚洲免费片 | 午夜久久久精品 | 99九九热 | 黄色成人av网站 | 激情av小说 | 特黄一级视频 | 精品国产一区二区视频 | 亚洲天堂aaa | 欧美撒尿777hd撒尿 | 中文字幕免费在线看线人 | 青青青免费视频观看在线 | 国产精品久久久久久久久绿色 | 国产性生活网站 | 欧美激情在线观看 | 欧美一区影院 | 日本一道本 | 欧美性免费 | 天天爽夜夜爽 | 欧美三级在线播放 | 日韩一区二区三区免费视频 | 天天干女人 | 福利视频精品 | 理论片大全免费理伦片 | av十大美巨乳 | 国产又粗又硬又长又爽的演员 | 青青伊人久久 | 91中出 | 台湾男男gay做爽爽的视频 | 亚洲性生活大片 | 久草电影在线 | 午夜影院免费看 | 丝袜美腿亚洲综合 | 九九啪 | 在线午夜av | 久久成人人人人精品欧 | 欧美一区二区人人喊爽 | japanesexxxx日本妞| 丝袜诱惑一区 | 亚洲激情在线播放 | 日韩免费av网站 | 东京久久| 最近免费中文字幕大全免费版视频 | www日本在线 | 国产噜噜噜噜噜久久久久久久久 | 亚洲AV成人无码电影在线观看 | 熟女一区二区三区四区 | 久草五月天| 亚洲高清天堂 | 成人无码av片在线观看 | 青青伊人精品 | 久久久久久av无码免费看大片 | 免费在线播放黄色片 | 成人www.| 日本乱子伦xxxx | sm捆绑调教视频 | 6699av| 国产h视频在线观看 | 美女色黄网站 | 国产高清精品在线观看 | 亚洲精品合集 | 成人网址在线观看 | 欧美精品免费看 | 超碰免费观看 | 中文字幕亚洲第一 | 欧美一区二区三区四区五区 | 91黑丝美女 | 亚洲成人a√| 暖暖av在线 | 91秘密入口 | 日日摸天天爽天天爽视频 | 人人91| 一个人看的www视频在线观看 | 国产精品欧美综合亚洲 | 欧美aa在线| 男女午夜爽爽爽 | 国产美女在线精品 | 2025国产精品视频 | 日韩欧美猛交xxxxx无码 | 伊人久操| 日韩av在线直播 | 特级西西444www高清大胆 | 91看片网页版| 爱爱91| 国产精品国产三级国产专区52 |