多线程学习之二坚不可摧模式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 }

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;
    }

}

测试类

/**
 *
 */
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
    }

}

坚不可错模式示范

/**
 *
 */
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;
    }

}
时间: 2024-10-06 01:52:17

多线程学习之二坚不可摧模式Immutable pattern的相关文章

ninject学习笔记二:单例模式singleton pattern

今天准备学习singleton pattern,顾单词思含义,就是一个实例的意思.单例的实现思路是:私有化构造函数,提供公有方法获取类的实例.下面定义一个音乐播放器类MusicPlayer,观察单例的实现方法 class MusicPlayer { private static readonly MusicPlayer player = new MusicPlayer(); private MusicPlayer() { } public static MusicPlayer GetInstan

Java多线程学习笔记--生产消费者模式

实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前水平只能膜拜,本次只能算学习笔记,为了巩固自己对Java多线程常规知识点的理解,路过大神还望能指导指导.下面一段代码是最常规的生产者消费者的例子: package com.zhanglei.demo; import java.util.ArrayList; import java.util.List

Java多线程学习(二)

一.定义产生返回值的任务 在上一篇文的介绍中,我们知道了定义任务通常的方法是定义一个实现Runnable接口的类,这个类被我们成为任务.然而也很容易注意到,任务的最重要的一个方法就是run( )方法,而run( )方法是没有返回值的,也就是说我们之前定义的任务不返回任何值. 如果想要定义一个有返回值的任务,则需要编写一个实现Callable接口的类.Callable是一种具有类型参数的泛型,他的类型参数表示的是call( )方法的返回值类型. 示例如下: 1 import java.util.c

多线程学习(二)

多线程概念  并发性和并行性  在单个处理器的多线程进程中,处理器可以在线程之间切换执行资源,从而执行并 发. 在共享内存的多处理器环境内的同一个多线程进程中,进程中的每个线程都可以在一 个 单独的处理器上并发运行,从而执行并行.如果进程中的线程数不超过处理器的数 目, 则线程的支持系统和操作环境可确保每个线程在不同的处理器上执行.例如,在 线程数 和处理器数目相同的矩阵乘法中,每个线程和每个处理器都会计算一行结果. 多线程结构一览 传统的UNIX已支持多线程的概念.每个进程都包含一个线程,因此

多线程学习笔记二

单例设计模式与多线程: 设计模式:对问题行之有效的解决方式.其实是一种思想. 单例设计模式: 解决的问题:可以保证一个类在内存中的对象唯一性. 比如对于多个程序使用同一个配置信息对象时,都需要保证对象的唯一性. 如果保证唯一性? 1.不允许其他程序用new创建该类对象. 2.在该类中创建一个本类实例. 3.对外提供一个方法,让其他程序可以获取对象. 实现步骤: 1.私有化该类的构造函数. 2.通过new在本类中创建一个本类对象. 3.定义一个共有的方法,将创建的对象返回. class Singl

JAVA多线程(十二)模式-Two Phase Termination

Two Phase Termination 显示调用资源清理方法,清理结束后正式关闭. 适用环境 需要在线程正式结束前清理资源. 样例 在线程的循环执行方法中检查终止状态,如果为真(或者运行中发生错误),退出循环体,进而执行循环体外finally部分进行清理. 此模式并非是立即停止,如果线程本身处于等待.阻塞等状态时,需要对中断后场景做处理,比如打断长时间等待的任务后转为继续处理其他任务. try{ while(!isStoped){ try{ doSomething(); }catch(Int

java多线程中synchronize锁的使用和学习,Thread多线程学习(二)

synchronize我的理解是为了保证程序中的原子性和一致性,即当你有两个线程同时操作一段代码的时候,要让这段代码的执行是在任何状态下都是正确的,首先要保证synchronize的使用要对同一个对象和同一把锁使用. [java] view plain copy print? <span style="font-size:14px;">public class TraditionalThreadSynchronized { public static void main(S

java多线程学习(二)——线程的创建

一.java创建线程的两个方法 1.从java.lang.Thread类派生出一个新的线程类,重载它的run()方法 2.实现Runnable接口,重载Runnable接口中的run()方法. 使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象. 二.java提供的两种创建线程的区别 java中类是单继承的,当定义一个新的线程类的时候,它只能扩展一个外部类,那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其他类,无法实现复

服务器多线程学习(二)

这里的代码是为了引入一个问题:线程安全 #include<iostream> #include<thread>//线程头文件 #include<future>//简单说std::future提供了一种访问异步操作结果的机制 #include<cmath>//数学操作头文件 #include<vector> #include<chrono>//获取本机器参考线程数的头文件 #include<cstdlib>//C语言中的st