线程安全定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要考虑进行额外的同步,或者在调用方进行任何其他的写作操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。
将Java语言中的各种操作共享的数据分为以下五类:
- 不可变:一定是线程安全的,如用final关键字修饰的变量,String对象,枚举类型,部分Number子类,如Double,Long等数值包装类,BigInteger,BigDecimal等大数据类型
- 绝对线程安全:对于Java API中标注自己是线程安全的类,大多不是绝对的线程安全,如Vector,虽然他的add(),get(),remove()方法都是被synchronized修饰的,但是在多线程的环境中,如果不在方法中做额外的操作,仍然是不安全的。
- 相对线程安全:通常意义上的线程安全,它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但对于一些特定顺序连续调用,可能需要在调用端使用额外的同步手段来保证调用的顺序性。如Vector,HashTable
- 线程兼容:指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全滴使用,如HashMap,ArrayList
- 线程对立:指无论调用段是否采用了同步措施,都无法在多线程环境中并发使用的代码,如resume(),suspend(),如果两个线程同时持有一个线程对象,一个尝试恢复线程,一个尝试中断线程,如果并发进行的话,无论调用时是否进行了同步,目标线程都是存在死锁风险