【多线程:设计模式】享元模式

简介: 【多线程:设计模式】享元模式

【多线程:设计模式】享元模式

01.介绍

保护性拷贝介绍

我之前的一篇文章浅显的模拟过String类 当时是为了探究为什么String类是不可变类型 文章地址在
https://blog.csdn.net/m0_71229547/article/details/125757561?spm=1001.2014.3001.5502
里面重要的结论就是 因为value数组是final修饰的 导致地址引用不可改变 所以Sting类的赋值 或者 获取子类的这种方法 其实都是再新new一个对象 然后返回,所以String类每次操作后返回的对象都是新的对象所以不可变,大家也可以看一下String类的substring方法

可以看出substring方法也是返回一个新的对象,这种通过创建副本对象来避免共享的手段称之为 保护性拷贝

享元模式介绍

保护性拷贝会出现说明问题就是如果对String类操作过多 势必会创建出非常多的对象 很显然是不合适的,所以出现了享元模式 它的使用场景是 当需要重用的数量有限的同一类对象时,例如我们的字符串 假如某个字符串已经有了 我们可以直接用这个字符串对象 而不用再重写创建一个

02.享元模式在常见类中的体现

包装类

在jdk中 Boolean Byte Short Integer Long Character等包装类提供了valueOf()方法 例如Long的valueOf会缓存-128-127之间的Long对象,在这个范围之间会重用对象,大于这个范围,才会新建Long对象

注意

1.Byte Short Long缓存的范围都是-128-127
2.Character缓存的范围是0-127
3.Integer的默认范围是-128-127

   最小值不能变
   但是最大值可以通过调整虚拟机参数 -Djava.lang.Integer.IntergerCache.high来改变

4.Boolean缓存了TRUE和FALSE

String类

String类是我们日常使用中最常用的类 所以它的优化很重要,在JVM中有一个字符串常量池,具体场景是这样

    String a = "ss"; // 如果"ss"还没有创建 就创建 并且缓存到字符串常量池
    String b = "ss"; // 如果创建过了 就从字符串常量池中获取"ss"的地址 并赋值给b

验证1

    public class TestXYMS {  
        public static void main(String[] args) {  
            String a = new String("ss");  
            String b = new String("ss");  
            System.out.println(a == b);  
        }  
    }

结果

false

解释
此时我们都是通过new来创建 并没有从字符串常量池中获取 所以为false

验证2

    public class TestXYMS {  
        public static void main(String[] args) {  
            String a = "ss";  
            String b = "ss";  
            System.out.println(a == b);  
        }  
    }

结果

true

解释
a = "ss" 创建了"ss"对象 并缓存到了常量池,b = "ss" 从常量池中获取

验证3

public class TestXYMS {  
    public static void main(String[] args) {  
        String t = new String("ss");  
        String a = t.intern(); // 从常量池中获取t的值
        String b = "ss";  
        System.out.println(a == b);  
    }  
}

结果

true

解释
new String("ss")后 "ss"缓存到字符串常量池 然后通过t.intern()可以从常量池获取到,通过b = "ss"也可以获取

目录
相关文章
|
10月前
|
设计模式 存储 缓存
【设计模式】【结构型模式】享元模式(Flyweight)
一、入门 什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的情况。 它的核心思想是将对象的内在状态(不变
331 16
|
5月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
324 2
|
5月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
395 1
|
10月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
214 0
|
10月前
|
设计模式 运维 监控
并发设计模式实战系列(4):线程池
需要建立持续的性能剖析(Profiling)和调优机制。通过以上十二个维度的系统化扩展,构建了一个从。设置合理队列容量/拒绝策略。动态扩容/优化任务处理速度。检查线程栈定位热点代码。调整最大用户进程数限制。CPU占用率100%
595 0
|
设计模式 存储 缓存
「全网最细 + 实战源码案例」设计模式——享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的内存消耗。通过分离对象的内部状态(可共享、不变)和外部状态(依赖环境、变化),它有效减少了内存使用。适用于存在大量相似对象且需节省内存的场景。模式优点包括节省内存和提高性能,但会增加系统复杂性。实现时需将对象成员变量拆分为内在和外在状态,并通过工厂类管理享元对象。
445 92
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
202 1
|
设计模式 存储 缓存
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
324 0
|
设计模式 缓存 安全
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
132 0

热门文章

最新文章