以下内容是我在阅读《图解Java多线程设计模式》一书中的总结和思考

本章配图文字是:想破坏也破坏不了。

 

定义

实例对象的内部状态不会发生变化,也就是说不提供对外改变属性的方法(除了创建对象时初始化的方法外),那么这个类就是Immutable的,无需任何互斥操作都可以保证线程安全。

 

Immutable类的几个常见特征

  1. 声明为final类:这样是为了生成子类并修改属性值的一种措施。
  2. private修饰属性:防止子类修改属性值,也防止实例对象修改属性值。
  3. final修饰属性值:说明属性一旦赋值,就不再改变。其实这个final是为了突出这个类的意图。

 

注意点:

  1. 如果一个类A的某个属性是一个实例对象,那么就要注意:如果该实例对象所属的类不是immutable类,那么这个类A也不一定是immutable类,就算该属性被final修饰。
  2. 当使用构造函数来初始化属性值的时候,如果入参不是immutable类,那么初始化的时候就要使用synchronized,这样才能保证初始化的时候要初始化的值不被修改。具体看课后最后一道练习题。

 

 

提及的JDK类包

  1. Thread.currentThread().getName():Thread.currentThread()返回当前线程的实例对象。然后再getName()获取当前对象的名字。currentThread()是Thread的静态方法,getName()是实例方法。
  2. String类是Immutable类,被final修饰的。String的值是放在常量池中的。所有的改动都会产生新的常量(当然是指常量池中找不到这个值的时候才会产生新的常量)。只有字符串" "的相加才会只限于常量池的操作,一旦有new或者是有对象的相加就会重新new一个对象出来。
  3. BigInteger和BigDecimal都是immutable类。同理还有八个包装类以及Pattern类。
  4. Collections.synchronizedList得到的list对象是线程安全的,但是该对象的迭代器不安全。
  5. java.util.concurrent.CopyOnWriteArrayList类是线程安全的,其迭代器也是线程安全的。