static vs final
static 靜態(tài)(類加載時(shí)(程序編譯時(shí))唯一初始化內(nèi)存)
final 最終(不可變,對(duì)變量而言基本對(duì)象值不可改漆际,對(duì)象引用不可改(對(duì)象內(nèi)容可改))
把上面兩個(gè)分別用來(lái)解決什么問(wèn)題弄清楚就行淆珊,不必糾結(jié)。
線程安全
xx所用到的資源的生命周期在一個(gè)線程內(nèi)奸汇,則xx是線程安全的施符。
不可變對(duì)象是安全的,引用不一定是安全的擂找,引用一個(gè)不可變對(duì)象不一定是安全地戳吝。(查看是安全,修改不一定安全)
簡(jiǎn)單內(nèi)存模型及對(duì)關(guān)鍵字 volatile 和 synchronized理解
堆(對(duì)象堆) 棧(線程棧)
局部變量和方法本地變量(也是局部變量)在線程中贯涎,
對(duì)象以及其 屬性變量在堆中听哭,
寫(xiě)回的時(shí)候就涉及到如何保持串行一致,
volatile是保持變量可見(jiàn)性,就是說(shuō)一個(gè)屬性變量(局部變量在非逃逸情況下(資源生命周期在線程內(nèi))是安全的)在線程中改變會(huì)回寫(xiě)到內(nèi)存中陆盘,所有改變都是可見(jiàn)的普筹,
但不能保證屬性變量在不同線程中的副本是一致的,
synchronized是解決競(jìng)爭(zhēng)問(wèn)題的隘马,同一時(shí)間只有一個(gè)線程可以進(jìn)入代碼塊太防,退出時(shí)變量被刷回內(nèi)存。
線程 wait() notify() notifyall() 可能存在信號(hào)丟失祟霍,假喚醒(很奇怪)杏头,必須在持有鎖的代碼塊中
成員變量線程副本 threadlocal
資源競(jìng)爭(zhēng)導(dǎo)致死鎖,死鎖可以用按順序加鎖沸呐,加鎖超時(shí)回退醇王,以及檢測(cè)死鎖算法并解扣方法解決。
并發(fā)編程中牢記小技巧
信號(hào)丟失:資源添加信號(hào)量特性
條件滑動(dòng):條件資源保持安全(同步)
管程鎖死:線程調(diào)度編寫(xiě)中注意持有的鎖是否復(fù)數(shù)崭添,復(fù)數(shù)則檢查
java并發(fā)數(shù)據(jù)結(jié)構(gòu)
鎖:重入(重入鎖死)寓娩,公平性(公平鎖),讀寫(xiě)鎖(其準(zhǔn)入?yún)^(qū)別)
信號(hào)量:Semaphore
阻塞隊(duì)列:BlockingQueue
線程池:ThreadPool
CAS數(shù)據(jù)結(jié)構(gòu):Compare and swap
無(wú)阻塞算法及數(shù)據(jù)結(jié)構(gòu):ConcurrentLinkedQueue