zoukankan      html  css  js  c++  java
  • 多线程程序设计学习(3)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,就会被破坏。

    room类

     1 package com.yeepay.sxf.thread2;
     2 /**
     3  * 看似是immutable类
     4  * 其实不是。
     5  * Student是可变的类
     6  * @author sxf
     7  *
     8  */
     9 public final class Room {
    10 
    11     private final Student student;
    12     private final String name;
    13 
    14     public Room(String name,Student student) {
    15         super();
    16         this.student=student;
    17         this.name = name;
    18     }
    19 
    20     public Student getStudent() {
    21         student.setName("sxf");
    22         return student;
    23     }
    24 
    25     public String getName() {
    26         return name;
    27     }
    28     
    29 }
    View Code

    student类

     1 package com.yeepay.sxf.thread2;
     2 
     3 public class Student {
     4     private String name;
     5     private String address;
     6     public Student() {
     7         super();
     8     }
     9     public Student(String name, String address) {
    10         super();
    11         this.name = name;
    12         this.address = address;
    13     }
    14     public String getName() {
    15         return name;
    16     }
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20     public String getAddress() {
    21         return address;
    22     }
    23     public void setAddress(String address) {
    24         this.address = address;
    25     }
    26     
    27     
    28     
    29 }
    View Code

    测试类

     1 package com.yeepay.sxf.thread2;
     2 /**
     3  * 测试线程
     4  * @author sxf
     5  *
     6  */
     7 public class Test {
     8 
     9     public static void main(String[] args) {
    10         
    11         
    12         
    13         Student student=new Student("hsl", "hnlh");
    14         Room room=new Room("ddd", student);
    15         Student student2=room.getStudent();
    16         System.out.println(student2.getName());
    17         
    18         //打印 :sxf
    19     }
    20 }
    View Code

    immutable范例(immutable只是一个概念模式,而不是一个固定的格式)

     1 package com.yeepay.sxf.thread2;
     2 /**
     3  * 坚不可摧模式。
     4  * @author sxf
     5  * 
     6  * 一个类定义成final类,是不允许有子类
     7  * 一个变量定义成final变量,意味着,一旦第一次赋值,便不可更改。
     8  * 其中的字段也是不可变的
     9  * 
    10  * 
    11  * 这个不可变性。不一定由final来决定。
    12  * 所谓不可变性,是一种设计的模式。不可改变,是为了防止多线程破坏对象。
    13  * 这种不可变,不需要保护的前提,就是不能被修改,一旦实例化,只提供读取操作
    14  * 而是可以通过很多方式:比如,私有化,不提供赋值操作,final修饰。
    15  *
    16  */
    17 public final class Persion {
    18     //声明变量
    19     private final String name;
    20     private final String address;
    21     
    22     //构造器赋值
    23     public Persion(String name, String address) {
    24         this.name = name;
    25         this.address = address;
    26     }
    27 
    28     //提供get访问方法,但不提供set赋值方法
    29     public String getName() {
    30         return name;
    31     }
    32 
    33     public String getAddress() {
    34         return address;
    35     }
    36     
    37     
    38     
    39     
    40     
    41     
    42 }
    View Code
  • 相关阅读:
    R语言数据读入函数read.table
    R语言最小浮点数
    R语言randomForest包实现随机森林——iris数据集和kyphosis数据集
    R语言 rwordseg包的下载
    R语言AMORE包实现BP神经网络——German数据集
    R语言清除内存,无法分配大小为324.5 Mb的矢量
    R语言多重共现性的检测
    Machine Learning for hackers读书笔记(六)正则化:文本回归
    Machine Learning for hackers读书笔记(五)回归模型:预测网页访问量
    完整的Django入门指南学习笔记4
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/4656316.html
Copyright © 2011-2022 走看看