多线程程序设计学习(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

 

时间: 2024-09-16 11:09:16

多线程程序设计学习(3)immutable pattern模式的相关文章

多线程程序设计学习(9)worker pattern模式

Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Request(工作内容的包装)--->Worker(工人线程)        二:Worker pattern模式什么时候使用--->类似生产者消费者 三:Worker pattern思考 四进阶说明--->工作线程取出请求内容包装后,根据多态,不同的请求执行不同的业务方法   Request接

多线程程序设计学习(2)之single threaded execution pattern

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

多线程程序设计学习(6)Producer-Consumer模式

Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程(制造蛋糕的线程)--->消费者线程(吃掉蛋糕的线程)         二:Producer-Consumer pattern模式什么时候使用--->大量生产+大量消费的模式 三:Producer-Consumer pattern思考--->[生产消费者模式],肩负保护数据安全性使命的是通道

多线程程序设计学习(5)balking模式和timed模式

Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程,当警戒条件达到执行具体操作的线程,参与者(被警戒的参与者)        二:balking pattern模式什么时候使用--->不需要刻意去执行什么操作的时候(比如说自动保存)--->不想等待警戒条件成立时.(不让线程休息)--->警戒条件只有第一次成立时候.    三:balking

多线程程序设计学习(7)read-write lock pattern

Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线程         二Read-Write Lock Pattern模式什么时候使用---> * 为了多线线程环境下保护数据安全,我们必须避免的冲突 * 一个线程读取,另一个线程写入的read-write conflick * 一个线程写入,另一个线程写入的write-write conflick *

多线程程序设计学习(10)Future pattern

Future pattern[订单取货模式] 一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口)--->Future(蛋糕票据)--->ReaData(制作蛋糕过程)        二:Future pattern模式什么时候使用---> 三:Future pattern思考       ---> 四进阶说明        ---> 数据类接口 1 package com.

多线程程序设计学习(4)guarded suspension模式

Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该参与者拥有一个被防卫的方法(getRequest),如果警戒条件达成,则执行.警戒条件不达成,则线程进入wait set                1.2该参与者还拥有一个改变参与者状态的方法(putRequest).参与者的状态影响着警戒条件的是否达成. --->该模式的角色:生产端线程,消费端线

多线程程序设计学习(12)Thread-soecific storage pattern

Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不同线程记录日志(Log)--->负责将日志写入文件的类(TsLog)         二:Thread-Specific Storage模式什么时候使用--->当每个线程必须有自己的独有信息时,可以将该信息放入线程保管箱ThreadLocal 三:Thread-Specific Storage思考

多线程程序设计学习(13)Active Object pattern

Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)--->主动对象接口(工人和工头)--->生产端线程(加工产品的线程)--->存放生产请求的队列(存放请求的队列)--->请求实例化(将方法的启动和执行分离的实例化包含)--->订单--->产品--->订单产品的共同接口        二:Active Object模式