詳情描述
在Java學(xué)習(xí)過(guò)程中總會(huì)遇到的是線程問(wèn)題,Java學(xué)習(xí)線程安全問(wèn)題其實(shí)就是并發(fā)的正確性問(wèn)題,一個(gè)線程安全的行為,既不需要額外的同步和協(xié)調(diào),也不用考慮在runtime中的調(diào)度和交替執(zhí)行,一定能返回預(yù)期的結(jié)果。
五種線程安全場(chǎng)景
1.不變性
較簡(jiǎn)單較純粹的場(chǎng)景就是不變性,一個(gè)不可變的對(duì)象一定是線程安全的,如final。
2.線程安全
線程安全是不切實(shí)際的,即使是線程安全的Vector容器,也只是在方法中用了修飾,方法調(diào)用時(shí)還是需要額外同步,否則,在多線程同時(shí)remove,仍然會(huì)有Index邊界溢出的錯(cuò)誤。
3.相對(duì)線程安全
一般意義上的線程安全就是相對(duì)線程安全,單獨(dú)操作是線程安全的,但是在特定情況下,還需要在調(diào)用時(shí)增加額外的同步手段。Java提供的線程安全如Vector、HashTabe、Collections.synchronizedCollection()等,都是相對(duì)線程安全。
4.線程兼容
一般意義上的不是線程安全其實(shí)是線程兼容,指的是本身并不線程安全,可以在調(diào)用時(shí)增加同步手段,實(shí)現(xiàn)線程安全,常見(jiàn)的和HashMap都是線程安全的。
5.線程對(duì)立
一些極端情況下,無(wú)論采用什么同步措施,都不能實(shí)現(xiàn)線程安全,就是線程對(duì)立,如Thread的suspend和resume,不能并行調(diào)用,很容易出現(xiàn)死鎖。
實(shí)現(xiàn)線程安全,既與代碼的編寫(xiě)有關(guān),也與虛擬機(jī)的同步和鎖有關(guān),常見(jiàn)的三種線程安全實(shí)現(xiàn)方法為:
1.互斥同步
就是共享數(shù)據(jù)在并行運(yùn)算中,同一時(shí)刻只能一個(gè)線程使用和都是互斥同步。
2.非阻塞同步
其實(shí)就是互斥同步的對(duì)立面,非阻塞同步相對(duì)樂(lè)觀,認(rèn)為并行不一定導(dǎo)致共享數(shù)據(jù)沖突,如果真的出現(xiàn)爭(zhēng)用沖突,再做補(bǔ)償即可(如重試操作,比如compareAndSet(current,next)就是不斷嘗試賦值,如果current和next的值和預(yù)期不一致,就說(shuō)明數(shù)據(jù)被修改了,會(huì)再次循環(huán)嘗試),sum.misc.Unsafe類就是非阻塞同步機(jī)制才能直接使用,用戶只能通過(guò)Java API間接使用,如非阻塞同步依賴于硬件指令集的發(fā)展和支持。
3.無(wú)同步方案
無(wú)同步方案不是不管線程安全,而是通過(guò)其他方式實(shí)現(xiàn)線程安全,不需要同步。
可重入代碼
一個(gè)方向是通過(guò)代碼實(shí)現(xiàn)無(wú)同步,就是可重入代碼,可重入代碼在執(zhí)行過(guò)程中,隨時(shí)可以中斷,轉(zhuǎn)而執(zhí)行其他任務(wù)(包括遞歸該代碼本身),然后重入繼續(xù)執(zhí)行,不會(huì)出現(xiàn)錯(cuò)誤。
可重入代碼也叫純代碼,容易令人想起純函數(shù)(當(dāng)然,不是同一維度),只要輸入相同的數(shù)據(jù),就能返回相同的結(jié)果。
線程本地存儲(chǔ)
另一個(gè)方向是通過(guò)避免多線程的數(shù)據(jù)共享實(shí)現(xiàn)無(wú)同步,就是線程本地存儲(chǔ),也就是把共享數(shù)據(jù)控制在一個(gè)線程內(nèi),避免沖突。
大部分使用消費(fèi)隊(duì)列的模式都是線程本地存儲(chǔ),這種模式會(huì)盡量在一個(gè)線程內(nèi)完成消費(fèi),Android中的Handler機(jī)制,就是通過(guò)對(duì)象(實(shí)際上是一個(gè)為對(duì)象的hashcode,value為對(duì)象本身),讓handler引用線程的Looper,Looper再依次處理自己中的Message,通過(guò)Message的target指向handler,實(shí)現(xiàn)在同一線程內(nèi)處理消息隊(duì)列。
千鋒教育:
千鋒西安校區(qū):
西安校區(qū)地址:西安市雁塔區(qū)高新六路52號(hào)立人科技C座西區(qū)4樓
面授課程:全棧WEB+培訓(xùn)、全鏈路設(shè)計(jì)培訓(xùn)、PHP全棧+服務(wù)器集群培訓(xùn)、JavaEE+分布式開(kāi)發(fā)培訓(xùn)、大數(shù)據(jù)+人工智能培訓(xùn)、 Unity游戲開(kāi)發(fā)培訓(xùn)、Python培訓(xùn)、云計(jì)算+Python運(yùn)維培訓(xùn)、全棧軟件測(cè)試培訓(xùn)、Android培訓(xùn)、iOS培訓(xùn)