又是一个理论的问题,各式各样的答案有很多,我给出一个个人认为解释地最好的:如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。
1
、不可变
像
String
、
Integer
、
Long
这些,都是
final
类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用。
2
、绝对线程安全
不管运行时环境如何,调用者都不需要额外的同步措施。要做到这一点通常需要付出许多额外的代价,Java中标注自己是线程安全的类,实际上绝大多数都不是线程安全的,不过绝对线程安全的类,
Java
中也有,比方说CopyOnWriteArrayList
、
CopyOnWriteArraySet。
3
、相对线程安全
相对线程安全也就是我们通常意义上所说的线程安全,像
Vector
这种,
add
、
remove
方法都是原子操作,不会被打断,但也仅限于此,如果有个线程在遍历某个Vector
、有个线程同时在
add
这个
Vector
,
99%的情况下都会出现ConcurrentModificationException
,也就是
fail-fast
机制。
4
、线程非安全
这个就没什么好说的了,
ArrayList
、
LinkedList
、
HashMap
等都是线程非安全的类。