单例模式基本要点:

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

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

(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. vue-router 基本操作

    安装 vue-router 在命令行中进入 vue 的项目目录里,运行命令 npm install vue-router --save 来进行安装   npm install vue-router - ...

  2. 正则表达式r和re

    # coding:utf-8 import re print 'a\ws' print r'a\nb' # r'': 一般用在正则表达式中,称为原始字符串,作用是将Python语法中的反斜杠转义给 取 ...

  3. 将近半个小时,把一小段简短的汇编代码写成了C语言代码

    我自己看,感觉好像一句一句翻译的,写得很是生硬,不如书上写的灵活 0040137E    8B7424 04       MOV ESI,DWORD PTR SS:[ESP+4]00401382    ...

  4. 2019-8-31-PowerShell-通过-WMI-获取系统安装软件

    title author date CreateTime categories PowerShell 通过 WMI 获取系统安装软件 lindexi 2019-08-31 16:55:58 +0800 ...

  5. 连接RDS数据库

  6. Luogu P2458 [SDOI2006]保安站岗(树形dp)

    P2458 [SDOI2006]保安站岗 题意 题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下 ...

  7. IPMI 远程配置

    #重启ipmi服务 #重启ipmi服务 #将 channel 1 设置为静态 IP #设置 IP #设置 channel 1 掩码 #设置 channel 1 网关 #查看用户名及 ID #设置ID号 ...

  8. WPF 免费控件库

    https://github.com/Infragistics/InfragisticsThemesForMicrosoftControls 几款WPF免费控件库,不过运行源码时需要下载三个DLL , ...

  9. 使用应用程序(Java/Python)访问MaxCompute Lightning进行数据开发

    MaxCompute Lightning是MaxCompute产品的交互式查询服务,支持以PostgreSQL协议及语法连接访问Maxcompute项目,让您使用熟悉的工具以标准 SQL查询分析Max ...

  10. csps-模拟7778lrd两试

    题面:https://www.cnblogs.com/Juve/articles/11707775.html 位运算: 大力分类讨论 第一次发现若a^b=c,则c^b=a,c^a=b #include ...