1.不可变设计
不可变: 如果一个对象在不能够修改其内部状态(属性),那么它就是线程安全的,因为不存在并发修改。 不可变设计的要素是final。比如String类是不可变的。该类、类中所有属性都是 final 的。属性用final修饰保证了该属性是只读的,不能修改。类用 final 修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性。 保护性拷贝: 对不可变的对象进行修改可以采用保护性拷贝。这种通过创建副本对象来避免共享的手段称之为保护性拷贝(defensive copy)。
2.享元模式
享元模式:当需要重用数量有限的同一类对象时。 由于保护性拷贝会创建多个对象比较浪费资源,通常会采用享元模式。通常会在包装类中使用该种模式。 在JDK中Boolean,Byte,Short,Integer,Long,Character等包装类提供了valueOf方法,例如Long的valueOf 会缓存-128~127之间的Long对象,在这个范围之间会重用对象,大于这个范围,才会新建Long对象。
3.final原理
字节码: 发现final变量的赋值也会通过putfield指令来完成,同样在这条指令之后也会加入写屏障,保证在其它线程读到它的值时不会出现为0的情况。 无状态也是线程安全的。因为该类中不设置成员变量。
|