亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java鎖之自旋鎖詳解

2019-11-26 15:25:23
字體:
來源:轉載
供稿:網友

鎖作為并發共享數據,保證一致性的工具,在JAVA平臺有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。

1、自旋鎖

自旋鎖是采用讓當前線程不停地的在循環體內執行實現的,當循環的條件被其他線程改變時 才能進入臨界區。如下

復制代碼 代碼如下:

public class SpinLock {

  private AtomicReference<Thread> sign =new AtomicReference<>();

  public void lock(){
    Thread current = Thread.currentThread();
    while(!sign .compareAndSet(null, current)){
    }
  }

  public void unlock (){
    Thread current = Thread.currentThread();
    sign .compareAndSet(current, null);
  }
}

使用了CAS原子操作,lock函數將owner設置為當前線程,并且預測原來的值為空。unlock函數將owner設置為null,并且預測值為當前線程。

當有第二個線程調用lock操作時由于owner值不為空,導致循環一直被執行,直至第一個線程調用unlock函數將owner設置為null,第二個線程才能進入臨界區。

由于自旋鎖只是將當前線程不停地執行循環體,不進行線程狀態的改變,所以響應速度更快。但當線程數不停增加時,性能下降明顯,因為每個線程都需要執行,占用CPU時間。如果線程競爭不激烈,并且保持鎖的時間段。適合使用自旋鎖。

注:該例子為非公平鎖,獲得鎖的先后順序,不會按照進入lock的先后順序進行。

2.自旋鎖的其他種類

上文我們講到了自旋鎖,在自旋鎖中 另有三種常見的鎖形式:TicketLock ,CLHlock 和MCSlock

Ticket鎖主要解決的是訪問順序的問題,主要的問題是在多核cpu上:

復制代碼 代碼如下:

package com.alipay.titan.dcc.dal.entity;

import java.util.concurrent.atomic.AtomicInteger;

public class TicketLock {
    private AtomicInteger                     serviceNum = new AtomicInteger();
    private AtomicInteger                     ticketNum  = new AtomicInteger();
    private static final ThreadLocal<Integer> LOCAL      = new ThreadLocal<Integer>();

    public void lock() {
        int myticket = ticketNum.getAndIncrement();
        LOCAL.set(myticket);
        while (myticket != serviceNum.get()) {
        }

    }

    public void unlock() {
        int myticket = LOCAL.get();
        serviceNum.compareAndSet(myticket, myticket + 1);
    }
}

每次都要查詢一個serviceNum 服務號,影響性能(必須要到主內存讀取,并阻止其他cpu修改)。

CLHLock 和MCSLock 則是兩種類型相似的公平鎖,采用鏈表的形式進行排序。

復制代碼 代碼如下:

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

public class CLHLock {
    public static class CLHNode {
        private volatile boolean isLocked = true;
    }

    @SuppressWarnings("unused")
    private volatile CLHNode                                           tail;
    private static final ThreadLocal<CLHNode>                          LOCAL   = new ThreadLocal<CLHNode>();
    private static final AtomicReferenceFieldUpdater<CLHLock, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock.class,
                                                                                   CLHNode.class, "tail");

    public void lock() {
        CLHNode node = new CLHNode();
        LOCAL.set(node);
        CLHNode preNode = UPDATER.getAndSet(this, node);
        if (preNode != null) {
            while (preNode.isLocked) {
            }
            preNode = null;
            LOCAL.set(node);
        }
    }

    public void unlock() {
        CLHNode node = LOCAL.get();
        if (!UPDATER.compareAndSet(this, node, null)) {
            node.isLocked = false;
        }
        node = null;
    }
}

CLHlock是不停的查詢前驅變量, 導致不適合在NUMA 架構下使用(在這種結構下,每個線程分布在不同的物理內存區域)

MCSLock則是對本地變量的節點進行循環。不存在CLHlock 的問題。

復制代碼 代碼如下:

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

public class MCSLock {
    public static class MCSNode {
        volatile MCSNode next;
        volatile boolean isLocked = true;
    }

    private static final ThreadLocal<MCSNode>                          NODE    = new ThreadLocal<MCSNode>();
    @SuppressWarnings("unused")
    private volatile MCSNode                                           queue;
    private static final AtomicReferenceFieldUpdater<MCSLock, MCSNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(MCSLock.class,
                                                                                   MCSNode.class, "queue");

    public void lock() {
        MCSNode currentNode = new MCSNode();
        NODE.set(currentNode);
        MCSNode preNode = UPDATER.getAndSet(this, currentNode);
        if (preNode != null) {
            preNode.next = currentNode;
            while (currentNode.isLocked) {

            }
        }
    }

    public void unlock() {
        MCSNode currentNode = NODE.get();
        if (currentNode.next == null) {
            if (UPDATER.compareAndSet(this, currentNode, null)) {

            } else {
                while (currentNode.next == null) {
                }
            }
        } else {
            currentNode.next.isLocked = false;
            currentNode.next = null;
        }
    }
}

從代碼上 看,CLH 要比 MCS 更簡單,

CLH 的隊列是隱式的隊列,沒有真實的后繼結點屬性。

MCS 的隊列是顯式的隊列,有真實的后繼結點屬性。

JUC ReentrantLock 默認內部使用的鎖 即是 CLH鎖(有很多改進的地方,將自旋鎖換成了阻塞鎖等等)。

(全文完)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老女人在线视频| 红桃av永久久久| 色狠狠久久aa北条麻妃| 亚洲精品丝袜日韩| 91精品久久久久久久久中文字幕| 亚洲欧美在线磁力| 8090理伦午夜在线电影| 高跟丝袜一区二区三区| 亚洲深夜福利在线| 8090理伦午夜在线电影| 日韩精品在线观看视频| 中文字幕日韩在线观看| 欧美中文字幕在线| 欧美国产日韩中文字幕在线| 国产精品三级美女白浆呻吟| 国产精品久久久精品| 亚洲国产欧美日韩精品| 欧美在线观看网站| 亚洲人成电影网| 亚洲欧美综合精品久久成人| 色悠悠国产精品| 色爱av美腿丝袜综合粉嫩av| 亚洲加勒比久久88色综合| 久久精品这里热有精品| 亚洲成人久久一区| 日韩精品视频免费专区在线播放| 在线观看欧美日韩国产| 欧美美女15p| 尤物yw午夜国产精品视频| 7777精品视频| 91沈先生在线观看| 色偷偷9999www| 久久久女人电视剧免费播放下载| 97激碰免费视频| 久久国产天堂福利天堂| 韩国三级日本三级少妇99| 九九久久久久久久久激情| 欧美激情视频播放| 成人精品久久av网站| 日韩欧亚中文在线| 日韩av在线看| 91成人国产在线观看| 亚洲一区二区三区久久| 中文字幕亚洲欧美日韩在线不卡| 亚洲bt天天射| 欧美激情亚洲国产| 一本色道久久88综合日韩精品| 久久久影视精品| 欧美极品欧美精品欧美视频| 国语自产精品视频在线看一大j8| 91免费欧美精品| 一区二区三区视频观看| 性视频1819p久久| 久久影视电视剧免费网站| 亚洲精品久久久久久久久久久| 欧美另类在线观看| 欧美精品在线极品| 国产精品久久久久久超碰| 国产精品视频区| 久久国产精彩视频| 91精品久久久久久久久中文字幕| 91免费电影网站| 国产精品久久久久久搜索| 日韩动漫免费观看电视剧高清| 欧美日韩一区二区三区在线免费观看| 亚洲国产欧美一区二区三区久久| 成人久久一区二区三区| 亚洲欧美制服另类日韩| 欧美伊久线香蕉线新在线| 亚洲欧洲一区二区三区在线观看| 国产精品专区一| 久久69精品久久久久久国产越南| 久久亚洲国产精品成人av秋霞| 久久久久久有精品国产| 高清视频欧美一级| 日韩av在线播放资源| 国产欧美精品一区二区| 这里精品视频免费| 国产91精品最新在线播放| 成人美女免费网站视频| 国产精品一区二区三区久久| 国产ts人妖一区二区三区| 国产精品扒开腿做爽爽爽视频| 日韩有码视频在线| 午夜欧美大片免费观看| 欧美日韩亚洲一区二区三区| 亚洲一区中文字幕在线观看| 亚洲国产精品人久久电影| 欧美一级视频免费在线观看| 欧美香蕉大胸在线视频观看| 中文字幕在线视频日韩| 欧美视频一区二区三区…| 国产精品电影网站| 国产精品免费电影| 日韩成人xxxx| 日韩在线观看免费全| 国产成人亚洲综合91精品| 欧美国产日韩一区二区| 精品久久久久久久久国产字幕| xx视频.9999.com| 欧美色道久久88综合亚洲精品| 91热精品视频| 亚洲色图25p| 久久久久久欧美| 日韩精品中文字幕久久臀| 色无极亚洲影院| 国产日产欧美精品| 国产精品久久久久久久久影视| 亚洲第一福利网| 欧美日韩免费一区| 日韩欧美一区二区在线| 亚洲丝袜一区在线| 久久精品国产亚洲一区二区| 91高清在线免费观看| 疯狂做受xxxx欧美肥白少妇| 亚洲人成在线观看网站高清| 亚洲精品欧美日韩专区| 黑人精品xxx一区| 国产在线精品一区免费香蕉| 久久夜精品va视频免费观看| 在线播放精品一区二区三区| 国外成人在线视频| 精品自在线视频| 欧美一区二粉嫩精品国产一线天| 色yeye香蕉凹凸一区二区av| 国产91精品黑色丝袜高跟鞋| 日韩一区二区福利| 欧美性开放视频| 国产精品视频白浆免费视频| 欧美午夜精品久久久久久人妖| 亚洲精品国产精品自产a区红杏吧| 亚洲精品二三区| 亚洲色图偷窥自拍| 欧美精品成人91久久久久久久| 66m—66摸成人免费视频| 97久久精品视频| 亚洲国产精品成人va在线观看| 日韩精品高清在线| 日韩在线观看免费网站| 日韩精品小视频| 亚洲精品日韩丝袜精品| 日韩欧美一区二区在线| 国产精品狼人色视频一区| 国产成人中文字幕| 欧美激情亚洲另类| 大胆欧美人体视频| 亚洲精美色品网站| 久久精品99国产精品酒店日本| 久久噜噜噜精品国产亚洲综合| 91豆花精品一区| 亚洲在线视频福利| 国产午夜精品视频免费不卡69堂| 成人亚洲综合色就1024| 国产一区二区在线免费| 久久久久久久久久久91| 成人黄色免费在线观看| 成人黄色片在线| 91chinesevideo永久地址| 亚洲黄色av网站| 欧美精品videossex性护士| 亚洲国产高清福利视频| 91国在线精品国内播放| 久久久999国产精品| 亚洲男女性事视频|