把对象封装到一个线程里
- Ad-hoc 线程封闭:程序控制实现,最糟糕,忽略
- 堆栈封闭:局部变量,无并发问题(局部变量)
- 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操作会出现
java.util.ConcurrentModificationException
改用 for循环
并发容器J.U.C
java.util.concurrent
容器 | 并发容器 |
---|---|
ArrayList | CopyOnWriteArrayList(建议在读多写少的场景使用) |
HashSet,TreeSet | CopyOnWriteArraySet,ConcurrentSkipListSet |
HashMap,TreeMap | ConcurrentHashMap,ConcurrentSkipListMap |
安全共享策略
线程限制: 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改
共享只读:一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问,但是任何线程都不能修改它
线程安全对象: 一个线程安全的对象或者容器,在内部通过同步机制来保证线程安全,所以其他线程无需额外的同步就可以通过公共接口 随意访问它。
被守护对象:被守护对象只能通过获取特定的锁来访问
网友评论