1 数据单线程内可见
单线程总是安全的。通过限制数据仅在单线程内可见,可以避免数据被其他线程篡改。最典型的就是线程局部变量,它存储在独立虚拟机栈帧的局部变量表中,与其它线程没有关系。ThreadLocal就是采用这种方式来实现线程安全的。
2 只读对象
只读对象是安全的。它的特点是允许复制,拒绝写入。最典型的只读对象又String,Integer类等。一个对象想要拒绝任何写入,必须满足以下条件:使用final修饰类,避免被继承;使用private final关键字避免属性被中途修改;没有任何更新方法;返回值不能为可变对象。
3线程安全类
某些线程安全类的内部有着非常明确的线程安全机制。比如StringBuffer就是一个线程安全类,它采用synchronized关键字来修饰相关方法。
4同步与锁机制
如果想要对某个对象并发更新操作,但又不属于以上描述的三类,需要开发人员在代码中实现安全的同步机制。那么在这个环境中容易出现这个问题,以后再来讨论如何去避免并发引发的问题。
线程安全的核心理念就是要么只读,要么加锁。合理利用好JDK提供的并发包,往往能够很好的解决问题。并发包的具体使用呢,以后再来讨论这个问题。