JVM学习(八):线程安全
1、 线程安全 :当 多个线程访问一个对象 时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也 无需进行额外的同步 ,或者在调用方进行任何其他的协调操作,调用这个对象的行为都 可以获得正确的结果 ,那这个对象就是线程安全的。 2、线程安全的等级(由强到弱依次如下): (1) 不可变 :不可变( Immutable )对象一定是线程安全的。如用 final 修饰的基本数据类型、 String 、 枚举类 以及java.lang. Number 的部分子类( Long 、 Double 等包装类,但AtomicInteger和AtomicLong并非不可变)。 (2) 绝对线程安全 :Java API中标注自己是线程安全的类,大多数都不是绝对线程安全。比如Vector容器,在同时做删除元素和获取元素的操作时,需要额外进行同步处理,才能真正做到线程安全。 (3) 相对线程安全 :即我们通常意义上所讲的线程安全,它需要保证对这个对象 单独的操作是线程安全的 ,但对于一些 特定顺序的连续调用 ,需要使用额外的同步措施才能保证调用结果的正确性。Java中比如Vector、HashTable、Collections的synchronizedCollection()方法包装的集合等都属于相对线程安全。 (4) 线程兼容 :对象本身不是线程安全,需要额外的同步手段来保证并发执行的安全