单例模式基本要点:

用于确保一个类只有一个实例,并且这个实例易于被访问。

让类自身负责保存他的唯一实例。这个类可以保证没有其他实例创建,并且他可以提供一个访问实例的方法,来实现单例模式。

(1)把构造方法声明为 private ,确保只能由自己创建,避免外部创建实例或被子类继承从而创建额外实例。

(2)定义一个私有静态的该类的实例作为该类的数据域,确保一个类只有一个实例。

(3)定义一个静态工厂方法,外部类不能实例化一个该类的对象,所有只能用static的方法,提供给其它类调用返回此单例类的唯一实例。

回收站单例类:

 import java.security.KeyStore.PrivateKeyEntry;

 public class RecycleBin {
private static RecycleBin recycleBin = null;
/*
*
*private 构造方法 保证其他类不能通过 new 创建实例
*/
private RecycleBin() {
System.out.println("回收站被创建!");
} public static RecycleBin getrecyclebin() { if (recycleBin==null) {
recycleBin = new RecycleBin();
}else {
System.out.println("系统只能有一个回收站,不能重复!");
} return recycleBin;
} void clearbin(){
System.out.println("回收站被清空!");
} }

客户测试类:

 public class SingletonPattern {

     public static void main(String[] args) {
RecycleBin x = RecycleBin.getrecyclebin();
x.clearbin();
RecycleBin y = RecycleBin.getrecyclebin();
x.clearbin();
if(x==y){
System.out.println("x和y是相同的实例");
}else {
System.out.println("x和y不是相同的实例");
}
} }

但是涉及到多线程仍然无法保证单例。

线程类:

 public class Mythread extends Thread {
@Override
public void run() {
RecycleBin x = null;
x=RecycleBin.getrecyclebin();
System.out.println(x+":"+x.hashCode()); }
}

客户测试类:

public class SingletonPattern {

    public static void main(String[] args) {
for(int i = 0;i<10;i++){
Mythread mythread = new Mythread();
mythread.start();
}
} }

测试结果:

com.Singleton.windowRecycleBin.RecycleBin@3c648a9d:1013222045
com.Singleton.windowRecycleBin.RecycleBin@10533d95:273890709
com.Singleton.windowRecycleBin.RecycleBin@3b9cec95:1000139925
com.Singleton.windowRecycleBin.RecycleBin@28a4ac8:42617544
com.Singleton.windowRecycleBin.RecycleBin@4bb40e1:79380705
com.Singleton.windowRecycleBin.RecycleBin@63e13bff:1675705343
com.Singleton.windowRecycleBin.RecycleBin@51ea99e2:1374329314
com.Singleton.windowRecycleBin.RecycleBin@dbfdd93:230677907

解决方法 1:使用synchronized关键字

synchronized 的英文意思是“被同步,已同步了”,该该关键字的作用就是为并发线程提供一种同步机制,用于保证在同一时刻最多只有一个线程来执行某段事先定义好要求同步访问的代码。因此,我们可以将一个方法标记为synchronized,迫使线程在执行这个方法前,要等待其他线程离开这个方法,这样就不会有两个线程同时操作该方法了。

于是修改单例类,在getrecyclebin()方法之前加上synchronized关键字,其它代码不变。

加上synchronized关键字之后,线程得到的是一个实例,但是这里又引出一个问题·:效率。每次调用getrecyclebin()的时候都要进行同步,会造成负担。

解决方法 2:双重检查加锁(不适用于1.4及以前版本的java)

利用双重检查加锁,首先检查是否已实现了实例  ,如果还没创建才进行同步,这样只会有第一次同步,效率自然会提高。

单例类:

 import java.security.KeyStore.PrivateKeyEntry;

  public class RecycleBin {
private static RecycleBin recycleBin = null;
/*
*
*private 构造方法 保证其他类不能通过 new 创建实例
*/
private RecycleBin() {
System.out.println("回收站被创建!");
} public static RecycleBin getrecyclebin() {
if (recycleBin==null) {
synchronized (RecycleBin.class) {
if (recycleBin==null) {
recycleBin = new RecycleBin();
}else {
System.out.println("系统只能有一个回收站,不能重复!");
} }
}
return recycleBin; } void clearbin(){
System.out.println("回收站被清空!");
} }
synchronized只加在能判断或函数外,如果加在   recycleBin = new RecycleBin();  上无法起到作用。
因为在第一次访问时,线程的 recycleBin 都为空。必须保证后续线程无法进入判断,否则后续线程仍会创建。

解决方法 3:饿汉式单例

懒汉式:

懒汉式单例指的是当程序第一次访问单例模式实例时才进行创建。

体现对象延迟加载的思想,效率高。尽可能的节约资源,但设计不当会造成线程不安全,代码相对于饿汉式复杂。第一次加载类对象时反应不快。必须处理好多个线程同时访问的问题,需通过双重锁等机制进行控制,可能会导致系统性能受影响。

饿汉式:

饿汉式单例是当程序启动时或单例被加载时,单例类实例就已经创建,所有一开始就new了实例。

对象预先加载,线程是安全的,反应速度快。但是资源利用不高,系统加载时间可能会比较长。

滥用单例模式的负面影响:如为了节省资源而将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出,如果实例化对象长时间不被利用,系统会认为是垃圾而将其回收,这将导致对象状态的丢失。

单例模式(Singleton)(单一实例)的更多相关文章

  1. 单例模式/singleton模式/创建型模式

    Java实现要点: 私有构造方法 线程安全(并发的考虑) 延迟加载(效率的考虑,对于较大的类在使用时在加载) 公有方法访问单一实例 常见单例模式代码及问题 //无延迟加载,常驻内存(即使不使用) cl ...

  2. [设计模式1]--单例模式(SINGLETON)

    搞笑解释: 俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我 定义: 单例模式确保某一个类只有一个实例,而且自行实例化并向整 ...

  3. Python设计模式 - 创建型 - 单例模式(Singleton) - 十种

    对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...

  4. Java 设计模式(三)-单例模式(Singleton Pattern)

    1     概念定义 1.1   定义 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 1.2   类型 创建类模式 1.3   难点 1)多个虚拟机 当系统中的单例类被拷贝运行在多 ...

  5. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  6. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  7. 设计模式之三:单例模式singleton

    单例设计模式确切的说就是一个类只有一个实例,有一个全局的接口来访问这个实例.当第一次载入的时候,它通常使用延时加载的方法创建单一实例. 提示:苹果大量的使用了这种方法.例子:[NSUserDefaul ...

  8. ooad单例模式-Singleton

                                                单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...

  9. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  10. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

随机推荐

  1. 面试系列10 es生产集群的部署架构

    如果你确实干过es,那你肯定了解你们生产es集群的实际情况,部署了几台机器?有多少个索引?每个索引有多大数据量?每个索引给了多少个分片?你肯定知道! 但是如果你确实没干过,也别虚,我给你说一个基本的版 ...

  2. 自动生成DTO(Sugar框架)

    step1:启动api项目 step2:使用postman工具,填上接口地址http://localhost:7788/api/automapper/AutoMapperSuper step3:表格数 ...

  3. 16-3-es5解析顺序

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Linux-c对一个十六进制数的某一位取反

    enum SWITCH_FLAG { SWITCH_ALL_FLAG = , SWITCH_WEB_FLAG = , …… } unsigned int switch_by_bit_value = 0 ...

  5. 02.MyBatis在DAO层开发使用的Mapper动态代理方式

    在实际开发中,Mybatis作用于DAO层,那么Service层该如何调用Mybatis Mybatis鼓励使用Mapper动态代理的方式 Mapper接口开发方法只需要程序员编写Mapper接口(相 ...

  6. 制作windows10系统启动U盘,从零开始。

    1.打开百度,搜索windows下载,选个这个点击进去. 2.会看到下图,然后点击立即下载工具按钮. 3.接下来由于网络的原因,可能需要漫长的等待.会下载一个MediaCreationTool1903 ...

  7. 使用subprocessm模块管理进程

    subprocess被用来替换一些老的模块和函数,如:os.system.os.spawn*.os.popen*.popen2.*.commands.*. subprocess的目的就是启动一个新的进 ...

  8. Audio 标签的使用和自己封装一个强大的React音乐播放器

    原文地址:https://www.dodoblog.cn/blog?id=5be84d5c70b2b617f27a4610 这篇文章主要介绍一下博客里的这个音乐播放器是怎么写的 为了更好的表达高深的东 ...

  9. Sequelize 中文API文档-1. 快速入门、Sequelize类

    1. https://itbilu.com/nodejs/npm/VkYIaRPz-.html#api-init 2. http://docs.sequelizejs.com/manual/tutor ...

  10. 33 N皇后问题

    原题网址:https://www.lintcode.com/zh-cn/old/problem/n-queens/# n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击. 给定一个整 ...