博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——单例模式
阅读量:6265 次
发布时间:2019-06-22

本文共 2371 字,大约阅读时间需要 7 分钟。

知识点:单例模式——只有一个实例的类

什么是设计模式:设计模式是在大量实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。

什么是单例模式:采取一定的方法保证,整个软件系统中,一个类只能存在一个对象实例

具体实现

 在这个类的内部需要实现

(1)将类的构造方法私有化,使得在在类的外部不能通过new创建该类的实例化对象

(2)在类的内部实例化唯一的对象,用private static修饰

(3)定义一个静态方法,供类的外部调用唯一的实例对象

  实现一 饿汉模式:在类加载时,对象就已经创建

//饿汉式 public class Singleton {
//私有化构造器,这样外部的类无法调用构造方法 private Singleton(){} public static String name; //内部实例化类的实例 private static Singleton instance=new Singleton(); //私有化对象,类通过公共方法调用 public static Singleton getInstance(){ return instance; } } 补充:当Singleton类被加载时,会初始化static修饰的instance,静态变量被创建并且分配内存,之后实例对象会一直占着这段内存,当类被卸载, 静态变量才被摧毁,释放内存 实现二 懒汉模式:调用get()方法时,实例才被创建
//懒汉式(线程安全问题) public class Singleton {
//私有化构造器 private Singleton(){} //内部实例化类的实例 private static Singleton instance; //私有化对象,类通过公共方法调用(创建,返回实例) public static Singleton getInstance(){ if(instance==null) { instance=new Singleton(); } return instance; } }

    补充当Singleton类被加载时,静态变量instance其实已经创建并且分配内存,当第一次调用getInstance方法,初始化instance,将对象实例内存的地址赋值给变量instance

另外在多线程的情况下,这种实现方式是线程不安全的

 

实现三 线程安全的"懒汉模式":解决线程问题,使用同步机制,两种实现方式,同步代码块和同步方法两种 (1)同步方法 (在方法上加synchronized修饰)
//懒汉式(线程安全的) public class Singleton {
//私有化构造器 private Singleton(){} //内部实例化类的实例 private static Singleton instance;
//私有化对象,类通过公共方法调用(创建,返回实例)    //方法上加同步锁    public static synchronized Singleton getInstance(){
if(instance==null) { instance=new Singleton(); } return instance; } }
(1)同步代码块 (在共享资源的代码外面,添加同步锁)
 
//懒汉式(线程安全的) public class Singleton {
//私有化构造器 private Singleton(){} //内部实例化类的实例 private static Singleton instance; public static Singleton getInstance(){ //对于一般的方法内,使用同步代码块,可以考虑使用this //对于静态的方法,使用当前类本身充当锁 synchronized(Singleton.class){ if(instance==null) { instance=new Singleton(); } } return instance; } }
 
补充:同步方法和同步代码块,保证了线程安全,但是多线程的情况下,效率不高,需考虑最佳的实现方案
实现三 单例模式最佳实现方案:在同步代码块之前判断,单例是否实例化,如果没有实例化,那么第一个线程框架实例,之后的线程进入代码块之前,因为已经实例化, 所以不会执行同步代码块,既保证了线程安全,又提高了效率
//懒汉式(最佳) public class Singleton {
//私有化构造器 private Singleton(){} //内部实例化类的实例 private static Singleton instance; public static Singleton getInstance(){ //第一次检查instance是否被实例化,如果没有线程实例化,则进入if代码块 if(instance==null) { //对于一般的方法内,使用同步代码块,可以考虑使用this //对于静态的方法,使用当前类本身充当锁 synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
 
 

 

参考:https://www.cnblogs.com/binaway/p/8889184.html

 

转载于:https://www.cnblogs.com/shuaifing/p/10578661.html

你可能感兴趣的文章
用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目
查看>>
数据分析:基于Python的自定义文件格式转换系统
查看>>
如何重置Sitecore CMS中的管理员密码
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
查看>>
NSBundle介绍
查看>>
POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
查看>>
ConnectString中enlist设置的含义
查看>>
潜移默化学会WPF(企业经验篇)--Log4Net(二)
查看>>
轻量级面向SQL的MySQL开源监控工具
查看>>
ubuntu 卸载 程序软件
查看>>
iOS 6,5支持 portrait,landscape (横竖屏的处理)
查看>>
FineUI v3.2.2发布了!(7 天后再出新版,给不给力?)
查看>>
Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)------转帖
查看>>
vb webbrower 相对坐标
查看>>
原始的js代码和jquery对比
查看>>
.net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2
查看>>
Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用
查看>>
jquery对象和javascript对象相互转换
查看>>
laravel开启调试模式
查看>>