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

首頁 > 開發 > Java > 正文

淺談Java中ABA問題及避免

2024-07-13 10:16:48
字體:
來源:轉載
供稿:網友

本文主要研究的是關于Java中ABA問題及避免的相關內容,具體如下。

在《Java并發實戰》一書的第15章中有一個用原子變量實現的并發棧,代碼如下:

java;">public class Node {	public final String item;	public Node next;	public Node(String item){		this.item = item;	}}
public class ConcurrentStack {	AtomicReference<Node> top = new AtomicReference<Node>();	public void push(String item){		Node newTop = new Node(item);		Node oldTop;		do{			oldTop = top.get();			newTop.next = oldTop;		}		while(!top.compareAndSet(oldTop, newTop));	}	public String pop(){		Node newTop;		Node oldTop;		do{			oldTop = top.get();			if(oldTop == null){				return null;			}			newTop = oldTop.next;		}		while(!top.compareAndSet(oldTop, newTop));		return oldTop.item;	}}

這個例子并不會引發ABA問題,至于為什么不會,后面再講解,下面先講一下ABA問題

什么是ABA?

引用原書的話:如果在算法中的節點可以被循環使用,那么在使用“比較并交換”指令就可能出現這種問題,在CAS操作中將判斷“V的值是否仍然為A?”,并且如果是的話就繼續執行更新操作,在某些算法中,如果V的值首先由A變為B,再由B變為A,那么CAS將會操作成功

ABA的例子

有時候,ABA造成的后果很嚴重,下面將并發棧的例子修改一下,看看ABA會造成什么問題:

public class Node {	public final String item;	public Node next;	public Node(String item){		this.item = item;	}}
public class ConcurrentStack {	AtomicReference<Node> top = new AtomicReference<Node>();	public void push(Node node){		Node oldTop;		do{			oldTop = top.get();			node.next = oldTop;		}		while(!top.compareAndSet(oldTop, node));	}	public Node pop(int time){		Node newTop;		Node oldTop;		do{			oldTop = top.get();			if(oldTop == null){				return null;			}			newTop = oldTop.next;			TimeUnit.SECONDS.sleep(time);		}		while(!top.compareAndSet(oldTop, newTop));		return oldTop;	}}

注意這里的變化,Node基本沒有變化

重點關注ConcurrentStack的變化

1、push方法:原來是使用內容構造Node,現在直接傳入Node,這樣就符合了“在算法中的節點可以被循環使用”這個要求

2、pop方法的sleep,這是模擬線程的執行情況,以便觀察結果

我們先往stack中壓入兩個Node:

ConcurrentStack stack = new ConcurrentStack(); stack.push(new Node("A")); stack.push(new Node("B")); 

然后創建兩個線程來執行出入棧的操作

線程A先執行出棧:讓NodeA出棧

stack.pop(3); 

因為某些原因,線程A執行出棧比較久,用了3s

線程B執行出棧之后再入棧:先然NodeA和NodeB出棧,然后讓NodeD,NodeC,NodeA入棧(NodeA在棧頂)

Node A = stack.pop(0); stack.pop(0); stack.push(new Node("D")); stack.push(new Node("C")); stack.push(A); 

注意:線程B實現了節點的循環利用,它先將棧里面的內容全部出棧,然后入棧,最后棧頂的內容是之前出棧的Node

線程B執行完這些動作之后,線程A才執行CAS,此時CAS是可以執行成功的

按照原來的想法,線程A和B執行之后,stack的內容應該是:C和D,C在棧頂,但這里的執行結果卻是Stack中什么都沒有,這就是ABA問題

如何避免ABA問題

Java中提供了AtomicStampedReference和AtomicMarkableReference來解決ABA問題

AtomicStampedReference可以原子更新兩個值:引用和版本號,通過版本號來區別節點的循環使用,下面看AtomicStampedReference的例子:

public class ConcurrentStack {	AtomicStampedReference<Node> top = new AtomicStampedReference<Node>(null,0);	public void push(Node node){		Node oldTop;		int v;		do{			v=top.getStamp();			oldTop = top.getReference();			node.next = oldTop;		}		while(!top.compareAndSet(oldTop, node,v,v+1));		//   }while(!top.compareAndSet(oldTop, node,top.getStamp(),top.getStamp()+1));	}	public Node pop(int time){		Node newTop;		Node oldTop;		int v;		do{			v=top.getStamp();			oldTop = top.getReference();			if(oldTop == null){				return null;			}			newTop = oldTop.next;			try {				TimeUnit.SECONDS.sleep(time);			}			catch (InterruptedException e) {				e.printStackTrace();			}		}		while(!top.compareAndSet(oldTop, newTop,v,v+1));		//   }while(!top.compareAndSet(oldTop, newTop,top.getStamp(),top.getStamp())); 		return oldTop;	}	public void get(){		Node node = top.getReference();		while(node!=null){			System.out.println(node.getItem());			node = node.getNode();		}	}}

注意:不能使用注釋中的方式,否則就和單純使用原子變量沒有區別了

AtomicMarkableReference可以原子更新一個布爾類型的標記位和引用類型,看下面的例子:

AtomicMarkableReference<Node> top = new AtomicMarkableReference<Node>(null,true);public void push(Node node){	Node oldTop;	Boolean v;	do{		v=top.isMarked();		oldTop = top.getReference();		node.next = oldTop;	}	while(!top.compareAndSet(oldTop, node,v,!v));}

總結

以上就是本文關于淺談Java中ABA問題及避免的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品av在线| 日韩成人性视频| 精品久久久久久中文字幕一区奶水| 777国产偷窥盗摄精品视频| 亚洲欧洲在线视频| 日韩中文字幕不卡视频| 欧美超级免费视 在线| 亚洲国产精品va在线看黑人动漫| 欧美高清视频在线| 揄拍成人国产精品视频| 久久天天躁狠狠躁夜夜av| 中文字幕日本欧美| 久久久成人的性感天堂| 国内精品模特av私拍在线观看| 精品无人区乱码1区2区3区在线| 97色在线播放视频| 亚洲美女在线观看| 亚洲香蕉成视频在线观看| 久久久之久亚州精品露出| 久久视频在线观看免费| 欧美有码在线观看| 国产精品日韩av| 欧美激情国产日韩精品一区18| 欧美激情精品久久久久久免费印度| 国产免费观看久久黄| 色综合久久久888| 欧美一区三区三区高中清蜜桃| 国产精品免费福利| 亚洲精品一区二区三区婷婷月| 青草青草久热精品视频在线观看| 欧美一级bbbbb性bbbb喷潮片| 日韩电影大全免费观看2023年上| 国产一区二区三区视频| 97av在线影院| 成人中文字幕在线观看| 91精品国产高清| 色噜噜狠狠色综合网图区| 成人高清视频观看www| 国产精品成人播放| 久久精品小视频| 97在线精品国自产拍中文| 欧美剧在线观看| 国产欧美欧洲在线观看| 亚洲精品在线视频| 国产精品欧美日韩一区二区| 最近2019好看的中文字幕免费| 亚洲自拍偷拍第一页| 91美女福利视频高清| 精品视频在线观看日韩| 国产成人精品电影久久久| 中文字幕亚洲字幕| 亚洲大胆人体在线| 久久国内精品一国内精品| 91精品在线看| 日韩免费在线看| 国产精品一区二区久久| 中文字幕国产亚洲| 91tv亚洲精品香蕉国产一区7ujn| 欧美人成在线视频| 91精品久久久久久久久久另类| 亚洲国产精品va在线看黑人| 国产精国产精品| 8x海外华人永久免费日韩内陆视频| 国产精品福利久久久| 欧美亚洲激情在线| 韩国国内大量揄拍精品视频| 日韩成人在线播放| 久久久久日韩精品久久久男男| 91系列在线播放| 66m—66摸成人免费视频| 中文字幕精品网| 性欧美xxxx交| 在线成人中文字幕| 国产精品自产拍在线观看中文| 亚洲高清色综合| 国产一区二区欧美日韩| 欧美性猛交xxxx免费看漫画| 久久久视频免费观看| 日韩欧美成人免费视频| 亚洲精品网址在线观看| 色爱av美腿丝袜综合粉嫩av| 色播久久人人爽人人爽人人片视av| 欧美日韩国产在线看| 色综合色综合网色综合| 国产成人a亚洲精品| 成人免费淫片视频软件| 国产精品美腿一区在线看| 久久久视频精品| 久热99视频在线观看| 97在线视频免费| 亚洲福利视频在线| 一本色道久久综合亚洲精品小说| 97激碰免费视频| 成人欧美一区二区三区在线| 久久国产精彩视频| 日韩精品在线视频美女| 国语自产精品视频在线看一大j8| 欧美成人免费va影院高清| 亚洲乱码av中文一区二区| 国产精品旅馆在线| 亚洲第一天堂无码专区| 久久精品精品电影网| 欧美另类第一页| 国产97在线视频| 欧美影院久久久| www.日本久久久久com.| 日韩美女av在线免费观看| 久久人人爽人人爽人人片av高清| 欧美激情亚洲综合一区| 91亚洲精品久久久| 日韩欧美高清视频| 欧美成人h版在线观看| 国产欧美日韩综合精品| 成人激情视频在线| 美女精品视频一区| 中文字幕精品www乱入免费视频| 久久综合国产精品台湾中文娱乐网| 日韩欧美视频一区二区三区| 在线国产精品视频| 国产激情久久久| 国产精品亚洲激情| 91精品国产综合久久香蕉922| 日韩有码片在线观看| 91国产高清在线| 91精品视频在线免费观看| 国产精品国产三级国产aⅴ浪潮| 国产v综合v亚洲欧美久久| 91沈先生作品| 久久久久久久久久久免费精品| 亚洲精品国产品国语在线| 亚洲成人三级在线| 亚洲综合在线小说| 日韩经典中文字幕在线观看| 国产精品久久久久9999| 久久久久久国产精品美女| 欧美成人性色生活仑片| 欧美片一区二区三区| 日韩一区二区三区在线播放| 久久成人一区二区| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲人永久免费| 国产精品极品美女粉嫩高清在线| 国外成人在线播放| 亚洲欧洲在线观看| 91久久精品日日躁夜夜躁国产| 久久久999精品免费| 亚洲最大福利网| 国产精品久久久久久av下载红粉| 成人精品在线观看| 国产国语刺激对白av不卡| 精品视频在线播放色网色视频| 欧美一性一乱一交一视频| 久久久久一本一区二区青青蜜月| 精品综合久久久久久97| 国产精品扒开腿做爽爽爽男男| 亚洲精品久久久久中文字幕欢迎你| 色综合久久久888| 成人女保姆的销魂服务| 久久资源免费视频| 亚洲精品wwww| 亚洲欧洲av一区二区| 青草青草久热精品视频在线观看| 2019最新中文字幕| 欧美大全免费观看电视剧大泉洋|