国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

分析Java非阻塞算法Lock-Free的實(shí)現(xiàn)

瀏覽:67日期:2022-08-11 14:06:04
目錄非阻塞的棧非阻塞的鏈表非阻塞的棧

我們先使用CAS來(lái)構(gòu)建幾個(gè)非阻塞的棧。棧是最簡(jiǎn)單的鏈?zhǔn)浇Y(jié)構(gòu),其本質(zhì)是一個(gè)鏈表,而鏈表的根節(jié)點(diǎn)就是棧頂。

我們先構(gòu)建Node數(shù)據(jù)結(jié)構(gòu):

public class Node<E> { public final E item; public Node<E> next; public Node(E item){this.item=item; }}

這個(gè)Node保存了內(nèi)存item和它的下一個(gè)節(jié)點(diǎn)next。

然后我們構(gòu)建非阻塞的棧,在該棧中我們需要實(shí)現(xiàn)pop和push方法,我們使用一個(gè)Atomic類來(lái)保存top節(jié)點(diǎn)的引用,在pop和push之前調(diào)用compareAndSet命令來(lái)保證命令的原子性。同時(shí),我們需要不斷的循環(huán),以保證在線程沖突的時(shí)候能夠重試更新。

public class ConcurrentStack<E> { AtomicReference<Node<E>> top= new AtomicReference<>(); public void push(E item){Node<E> newNode= new Node<>(item);Node<E> oldNode;do{ oldNode=top.get(); newNode.next= oldNode;}while(!top.compareAndSet(oldNode, newNode)); } public E pop(){Node<E> oldNode;Node<E> newNode;do { oldNode = top.get(); if(oldNode == null){return null; } newNode=oldNode.next;}while(!top.compareAndSet(oldNode, newNode));return oldNode.item; }}非阻塞的鏈表

構(gòu)建鏈表要比構(gòu)建棧復(fù)雜。因?yàn)槲覀円S持頭尾兩個(gè)指針。以put方法來(lái)說(shuō),我們需要執(zhí)行兩步操作:1. 在尾部插入新的節(jié)點(diǎn)。2.將尾部指針指向最新的節(jié)點(diǎn)。

我們使用CAS最多只能保證其中的一步是原子執(zhí)行。那么對(duì)于1和2的組合步驟該怎么處理呢?

我們?cè)僮屑?xì)考慮考慮,其實(shí)1和2并不一定要在同一個(gè)線程中執(zhí)行,其他線程在檢測(cè)到有線程插入了節(jié)點(diǎn),但是沒有將tail指向最后的節(jié)點(diǎn)時(shí),完全幫忙完成這個(gè)操作。

我們看下具體的代碼實(shí)現(xiàn):

public class LinkedNode<E> { public final E item; public final AtomicReference<LinkedNode<E>> next; public LinkedNode(E item, LinkedNode<E> next){this.item=item;this.next=new AtomicReference<>(next); }}

先構(gòu)建一個(gè)LinkedNode類。

public class LinkedQueue<E> { private final LinkedNode<E> nullNode= new LinkedNode<>(null, null); private final AtomicReference<LinkedNode<E>> head= new AtomicReference<>(nullNode); private final AtomicReference<LinkedNode<E>> tail= new AtomicReference<>(nullNode); public boolean put(E item){ LinkedNode<E> newNode = new LinkedNode<>(item, null); while (true){LinkedNode<E> currentTail= tail.get();LinkedNode<E> tailNext= currentTail.next.get();if(currentTail == tail.get()){ if (tailNext != null) {//有其他的線程已經(jīng)插入了一個(gè)節(jié)點(diǎn),但是還沒有將tail指向最新的節(jié)點(diǎn)tail.compareAndSet(currentTail, tailNext); }else{//沒有其他的線程插入節(jié)點(diǎn),那么做兩件事情:1. 插入新節(jié)點(diǎn),2.將tail指向最新的節(jié)點(diǎn)if(currentTail.next.compareAndSet(null, newNode)){ tail.compareAndSet(currentTail, newNode);} }} } }}

以上就是分析Java非阻塞算法Lock-Free的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Java非阻塞算法Lock-Free的實(shí)現(xiàn)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人美女网| 成人黄色免费看 | 成人网18免费软件 | 亚洲精品高清在线观看 | 精品国产一区二区三区免费看 | 国产精品亚欧美一区二区三区 | 国产一区二区成人 | 国产国产人免费人成成免视频 | 特级aa毛片在线播放 | 国产精品无码久久综合网 | 久精品在线观看 | 九九九九精品视频在线播放 | 在线视频 亚洲 | 国产欧美日韩亚洲 | 欧美一区二区三区在线观看免费 | 国产黄色片在线免费观看 | 三级毛片网站 | aa级毛片 | 国产一级视频在线观看 | 亚洲午夜国产精品 | 久久狠狠色狠狠色综合 | 曰韩一级毛片 | 国产网站黄色 | 亚洲三级网站 | 亚洲理论在线观看 | 国产精品成人免费 | 九九九九九九 | 国产激情一区二区三区 | 久久99精品久久久久久三级 | 久久99精品综合国产首页 | 久草视频网站 | 男人的天堂欧美精品色偷偷 | 九九福利视频 | 在线精品视频免费观看 | 国产成人三级经典中文 | 日韩一级欧美一级 | 日本精品在线观看 | 日韩美女免费视频 | 久青草国产在线 | 欧美成人高清免费大片观看 | 香蕉久久久 |