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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于ReetrantLock

發布時間:2024/1/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于ReetrantLock 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ReetrantLock?? 內部靜態類? Sync? 繼承AbstractQueuedSynchronizer(負責阻塞隊列,線程去槍戰鎖,并且包含了node)

NonfairSync? extends Sync extends AbstractQueuedSynchronizer

FairSync extends Sync extends AbstractQueuedSynchronizer

AbstractQueuedSynchronizer?中有一個模板方法 tryacquire(模板模式)

非公平鎖NonfairSync

?final void lock() {

    //直接槍占啊。基于cas保證state操作在并發的時候是正確的
??????????? if (compareAndSetState(0, 1))
??????????????? setExclusiveOwnerThread(Thread.currentThread());
??????????? else
??????????????? acquire(1);
??????? }

公平鎖FairSync
??????? final void lock() {
??????????? acquire(1);
??????? }

acquire的方法 是在AbstractQueuedSynchronizer中實現的

public final void acquire(int arg) {

//addWaiter是加入到隊列尾巴 吧線程封裝成node? acquireQueued里面又做了循環。所有線程去搶占鎖。至于里面的對線程的狀態的切換不用關系
??????? if (!tryAcquire(arg) &&
??????????? acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
??????????? selfInterrupt();
??? }

tryAcquire 在AbstractQueuedSynchronizer 只是實現了個方法

?protected boolean tryAcquire(int arg) {
??????? throw new UnsupportedOperationException();
??? }

具體的實現分別在NonfairSync? FairSync

前者

?final boolean nonfairTryAcquire(int acquires) {
??????????? final Thread current = Thread.currentThread();
??????????? int c = getState();
??????????? if (c == 0) {
??????????????? if (compareAndSetState(0, acquires)) {
??????????????????? setExclusiveOwnerThread(current);
??????????????????? return true;
??????????????? }
??????????? }
??????????? else if (current == getExclusiveOwnerThread()) {
??????????????? int nextc = c + acquires;
??????????????? if (nextc < 0) // overflow
??????????????????? throw new Error("Maximum lock count exceeded");
??????????????? setState(nextc);
??????????????? return true;
??????????? }
??????????? return false;
??????? }

后者

protected final boolean tryAcquire(int acquires) {
??????????? final Thread current = Thread.currentThread();
??????????? int c = getState();
??????????? if (c == 0) {

      //判斷當前線程是否是隊列頭 保證了按順序
??????????????? if (!hasQueuedPredecessors() &&
??????????????????? compareAndSetState(0, acquires)) {
??????????????????? setExclusiveOwnerThread(current);
??????????????????? return true;
??????????????? }
??????????? }
??????????? else if (current == getExclusiveOwnerThread()) {
??????????????? int nextc = c + acquires;
??????????????? if (nextc < 0)
??????????????????? throw new Error("Maximum lock count exceeded");
??????????????? setState(nextc);
??????????????? return true;
??????????? }
??????????? return false;
??????? }

轉載于:https://www.cnblogs.com/tecnologycc/p/10174689.html

總結

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

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