多线程程序设计学习(3)immutable pattern模式

简介: Immutable pattern【坚不可摧模式】一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类。

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

 

目录
打赏
0
0
0
0
11
分享
相关文章
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
37 10
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
335 6
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
Lettuce的特性和内部实现问题之在同步调用模式下,业务线程是如何拿到结果数据的
通用快照方案问题之Hystrix进行指标监控如何解决
通用快照方案问题之Hystrix进行指标监控如何解决
60 0
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
96 0
|
23天前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
45 17
|
1月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
54 26
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等