单例模式基本要点:

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

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

(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导航条选中项样式

    html: <div id="app"> <div class="collection"> <a href="#!&qu ...

  2. java-day06

    面向过程 每一个具体的步骤都亲力亲为,详细处理每一个细节 面向对象 不关心具体步骤,而是找一个已经具有该功能的人来帮我做事 特点 封装性 继承性 多态性 类 是一组相关属性和行为的集合 成员变量(属性 ...

  3. 压测:mysqlslap

    MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常简单,通过mysqlslap –help可以获得可用的选项.这里列一些主 ...

  4. 使用vue-cli搭建vue项目简单教程

    一直没有时间来写些东西,今天就写写vue脚手架吧,初建一个vue项目. vue是近段时间来特别火的一个mvvm框架,小巧.简单.易学,如果你的前端基础还好的话,学起来挺简单的.官网地址: https: ...

  5. angular 页签

    HTML: <link rel="stylesheet" href="views/show/tab.css"/> <div> <u ...

  6. JS数组 呼叫团里成员(使用数组元素) myarray[0]

    呼叫团里成员(使用数组元素) 我们知道数组中的每个值有一个索引号,从0开始,如下图, myarray变量存储6个人的成绩:   要得到一个数组元素的值,只需引用数组变量并提供一个索引,如: 第一个人的 ...

  7. 廖雪峰Java13网络编程-1Socket编程-1网络编程概念

    1.计算机网络 1.1 什么是计算机网络? 两台或更多计算机组成的网络 同一网络内的任意2台计算机都可以直接通信 所有计算机必须遵循同一种网络协议 1.2 什么是互联网 互联网是网络的网络 互联网采用 ...

  8. token方法可用于临时关闭令牌验证,

    token方法可用于临时关闭令牌验证,例如: $model->token(false)->create(); 即可在提交表单的时候临时关闭令牌验证(即使开启了TOKEN_ON参数). 大理 ...

  9. DISTINCT 方法用于返回唯一不同的值 。

    DISTINCT 方法用于返回唯一不同的值 . 例如: $Model->distinct(true)->field('name')->select(); 生成的SQL语句是: SEL ...

  10. php包含文件

    PHP 包含文件 PHP include 和 require 语句 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容. include 和 require 语句用于在执 ...