java多线程之线程安全分析

为什么要分析线程安全?

​ 我的理解是,多线程的前提下,只有保证线程安全,或者说,只有确保为不安全的代码部分进行加锁,才能保证代码最终的结果是正确的。

成员变量和静态变量安全分析

可以从以下几个点去考虑:

局部变量是否安全:

常见的线程安全类:

线程安全指的是,多个线程调用它们的同一个实例的某个方法时,是线程安全的,即

不可变类的线程安全性

String、Integer都是不可变类,因为其内部的状态不可以改变,所以这些类中的方法都是线程安全的。不可变类是指,这个对象创建了就不能修改了,只能读取,如String,String的replace()方法等,是创建了新的String对象,并没有修改原来的对象。

为什么String类是final的

根据java的知识:

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写

正是因为这个不能被子类重写,所以可以保证String一定是安全的。

为什么被子类重写会不安全:

因为子类如果可以重写方法,例如:子类用多线程来重写String中的方法,就可能因为多个线程的上下文切换,导致线程不安全。这类因为子类重写导致不安全的情况,经常不容易想到。