如果对象被创建后,状态就不能更改,那么就是不可变
一旦person的树形被final修饰,就不能再修改,
增加可变属性,那么是可变的;对于不可变的对象,一定是对线程安全的,不需要采取任何措施保证其线程安全
类防止被继承、方法防止被重写、变量防止被修改 天生是线程安全的,不需要额外的线程开销
注意 person指向是final的,它的引用指向不能变,但是属性可以变
引申:静态方法不能被重写
运行结果
不变形并不意味着,简单用final修饰就不可变了 对于基本数据类型,确实被final修饰后就具有不变性 但是对于对象类型,需要该对象保证自身被创建后,状态永远不会变才行
代码演示:
package immutable; /** * 描述: 演示栈封闭的两种情况,基本变量和对象 先演示线程争抢带来错误结果,然后把变量放到方法内,情况就变了 */ public class StackConfinement implements Runnable { int index = 0; public void inThread() { int neverGoOut = 0; synchronized (this) { for (int i = 0; i < 10000; i++) { neverGoOut++; } } System.out.println("栈内保护的数字是线程安全的:" + neverGoOut); } @Override public void run() { for (int i = 0; i < 10000; i++) { index++; } inThread(); } public static void main(String[] args) throws InterruptedException { StackConfinement r1 = new StackConfinement(); Thread thread1 = new Thread(r1); Thread thread2 = new Thread(r1); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println(r1.index); } }