把對象封裝到一個線程里
- Ad-hoc 線程封閉:程序控制實(shí)現(xiàn)年局,最糟糕,忽略
- 堆棧封閉:局部變量饶套,無并發(fā)問題(局部變量)
- ThreadLocal 線程封閉: 特別好的封閉方法
線程不安全 | 線程安全 |
---|---|
StringBuilder | StringBuffer |
SimpleDateFormat | JodaTime |
ArrayList,HashSet,HashMap等Collection |
同步容器
線程不安全 | 同步容器類(不代表線程安全) |
---|---|
ArrayList | Vector,Stack |
HashMap | HashTable(key,value不能為null) |
List,Set,Map | Collections.synchronizedXXXX(List饺律,Set,Map) |
在 iterator 和foreach 中的remove操作會出現(xiàn)
java.util.ConcurrentModificationException
改用 for循環(huán)
并發(fā)容器J.U.C
java.util.concurrent
容器 | 并發(fā)容器 |
---|---|
ArrayList | CopyOnWriteArrayList(建議在讀多寫少的場景使用) |
HashSet,TreeSet | CopyOnWriteArraySet,ConcurrentSkipListSet |
HashMap,TreeMap | ConcurrentHashMap,ConcurrentSkipListMap |
安全共享策略
線程限制: 一個被線程限制的對象罚斗,由線程獨(dú)占,并且只能被占有它的線程修改
共享只讀:一個共享只讀的對象苍日,在沒有額外同步的情況下惭聂,可以被多個線程并發(fā)訪問,但是任何線程都不能修改它
線程安全對象: 一個線程安全的對象或者容器相恃,在內(nèi)部通過同步機(jī)制來保證線程安全辜纲,所以其他線程無需額外的同步就可以通過公共接口 隨意訪問它。
被守護(hù)對象:被守護(hù)對象只能通過獲取特定的鎖來訪問