多线程学习之二坚不可摧模式Immutable pattern

Immutable pattern【坚不可摧模式】

一:immutable pattern的参与者
--->immutable(不变的)参与者
        1.1:immutable参与者是一个字段的值都无法更改的类。
        1.2:immutable也没有任何用来更改字段值的方法。
        1.3:immutable参与者方法不需要设置synchronized

二:immutable pattern模式什么时候使用
--->当实例产生后,状态不再变化时
        2.1实例状态不再变化是首要条件。
        2.2何为不可变状态。就是实例的值不会发生变化。
--->实例需要共享,而且访问频繁时
--->String 类是immutable类不需要synchronized保护
       StringBuffer类是非immutable类需要synchronized保护


三:immutable pattern思考
--->final关键字
        2.1:final类:当生命final类,该类无法延伸,就是不能定义子类。
        2.2:final方法:
                        若实例方法(非静态)声明成final时,该方法无法被子类覆盖重写。
                        若将类方法(静态)声明成final时,该方法无法被子类所隐藏
        2.3final变量
                        final字段只能赋值一次。
                        final(非静态)字段赋值分两种方法:(1)声明时赋值(2)通过构造器赋值
                        final(静态)字段赋值分两种方法:(1)声明时赋值(2)通过静态块赋值
        2.3覆盖和隐藏的概念
                        实例方法被子类方法所覆盖时,实际被调用的方法是在执行时决定的
                        类方法被子类方法隐藏时,实例被调用的方法是在编译时决定的。

--->immutable不变性很微妙。不是设置finnal,私有化,不提供赋值方法,就是永久不变性的。
                        final只是不可再次赋值。如果final的字段是一个可变的引用属性,那么immutable,就会被破坏。

Student类

 1 /**
 2  * 
 3  */
 4 package com.benxq.thread3;
 5 
 6 /**
 7  * Created by qucf on 2015年10月22日. 
 8  */
 9 public class Student {
10 
11     private String name;
12     private String address;
13     public String getName() {
14         return name;
15     }
16     public void setName(String name) {
17         this.name = name;
18     }
19     public String getAddress() {
20         return address;
21     }
22     public void setAddress(String address) {
23         this.address = address;
24     }
25     /**
26      * @param name
27      * @param address
28      */
29     public Student(String name, String address) {
30         super();
31         this.name = name;
32         this.address = address;
33     }
34 }
View Code

Room类

/**
 * 
 */
package com.benxq.thread3;

/**
 * 看似immutable类
 * 其实不是,Student是可变的类
 * Created by qucf on 2015年10月22日. 
 */
public final class Room {
    
    private final Student student;
    private final String name;
    
    public Room(String name,Student student){
        this.name=name;
        this.student=student;
    }
    
    public Student getStudent() {
        student.setName("benxq");
        return student;
    }
    public String getName() {
        return name;
    }
    
    
}
View Code

测试类

/**
 * 
 */
package com.benxq.thread3;

/**
 * Created by qucf on 2015年10月22日. 
 */
public class Test {
    
    public static void main(String[] args) {
        Student student=new Student("zhangsan", "beijing");
        Room room=new Room("room1", student);
        Student s2=room.getStudent();
        System.out.println(s2.getName());
        //打印 benxq
    }

}
View Code

坚不可错模式示范

/**
 * 
 */
package com.benxq.thread3;

/**
 * 一个类定义成final类,是不允许有子类
 *  一个变量定义成final变量,意味着,一旦第一次赋值,便不可更改。 
 * 其中的字段也是不可变的
 * 这个不可变性。不一定由final来决定。
 * 所谓不可变性,是一种设计的模式。不可改变,是为了防止多线程破坏对象。
 * 这种不可变,不需要保护的前提,就是不能被修改,一旦实例化,只提供读取操作
 * 而是可以通过很多方式:比如,私有化,不提供赋值操作,final修饰。
 * Created by qucf on 2015年10月22日. 
 */
public final class Room {
    
    private final Student student;
    private final String name;
    
    public Room(String name,Student student){
        this.name=name;
        this.student=student;
    }
    
    public Student getStudent() {
        return student;
    }
    public String getName() {
        return name;
    }
    
    
}
原文地址:https://www.cnblogs.com/quchengfeng/p/4901273.html