編寫線程安全的代碼的核心是:
對(duì)可變共享的狀態(tài)訪問(wèn)的管理藕筋。
三種(多個(gè)線程對(duì)同一個(gè)可變的狀態(tài)變量沒(méi)有做合適的同步時(shí) 出現(xiàn)錯(cuò)誤的解決方法):
- 不共享
- 不修改
- 加同步 一般前兩個(gè)是避免不了的時(shí)候加鎖显蝌。
需要考慮線程安全的情況
對(duì)于可能被多個(gè)線程同時(shí)訪問(wèn)的可變狀態(tài)變量,在訪問(wèn)它的時(shí)候都要持有同一個(gè)鎖。
一般的加鎖機(jī)制是 把可變共享變量封裝在一個(gè)對(duì)象中羊苟,然后對(duì)本對(duì)象加鎖祭阀。例如Vector類
同步策略:
- 內(nèi)置鎖(可重入)傻工,
- 讀寫鎖(復(fù)制)
- Lock
- Collections獲取
- 并發(fā)容器 原子操作 AtomicLong
原子性
原子類 AtomicLong等 作用:降低使用synchronized 并發(fā)。提升性能咙冗。
比如Vector類是同步類沾歪。
但是執(zhí)行復(fù)合操作的時(shí)候并不能保證線程安全。此時(shí)需要使用鎖雾消。
復(fù)合操作 和 多線程執(zhí)行順序(競(jìng)態(tài)條件)問(wèn)題 引發(fā)的無(wú)法使用原子性類解決
復(fù)合操作情況下 原子操作也會(huì)出現(xiàn)問(wèn)題
需要使用鎖
鎖(原子操作無(wú)法實(shí)現(xiàn)的解決方法)
鎖灾搏,用來(lái)鎖住可變共享 狀態(tài)。
有一個(gè)例子是使用了鎖立润,但是因?yàn)椴皇擎i的可變共享變量狂窑,而是鎖的本對(duì)象(本對(duì)象并沒(méi)有封裝這個(gè)可變共享變量)導(dǎo)致線程不安全。