单例模式基本要点:

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

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

(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. STM32F103 Feature

  2. Vue .sync修饰符与$emit(update:xxx)写法问题

    在学习vue自定义事件的.sync修饰符实现改变数值时发现一个问题如下由于props的大小写命名:fatherNum,对应不同的$emit()会有不同的效果,具体如下: 使用.sync修饰符,即 // ...

  3. springboot新手脱坑之无法下载依赖包

    1. Apache maven 3.39配置 1.环境变量自己配置, 2.配置阿里云镜像和本地仓库 <localRepository>D:\Apache\maven\repository& ...

  4. OA系统和ERP系统的区别

    一.OA和ERP的区别 1.含义不同: OA指Office Automation,中文简称自动办公系统,帮助企业内部管理沟通的工具,比如新闻公告.内部沟通.考勤.办公.员工请假.审批流程等. ERP指 ...

  5. Oracle 从 dual 表中查询返回多行记录

    同时查询出十条数据 ; 按照这个特性计算两个日期之间的工作日: select days, week as days, to_char(to_date(, 'day') as week from dua ...

  6. 操作RDS数据库

  7. python类的静态方法和类方法区别

    先看语法,python 类语法中有三种方法,实例方法,静态方法,类方法. # coding:utf-8 class Foo(object): """类三种方法语法形式&q ...

  8. A*算法——第K短路

    例题 JZOJ senior 1163第K短路 题目描述 Bessie 来到一个小农场,有时她想回老家看看她的一位好友.她不想太早地回到老家,因为她喜欢途中的美丽风景.她决定选择K短路径,而不是最短路 ...

  9. 2016.11.5初中部上午NOIP普及组比赛总结

    2016.10.29初中部上午NOIP普及组 这次比赛算是考的最差的一次之一了,当中有四分之三是DP. 进度: 比赛:没分+0+没分+40=40 改题:AC+0+没分+40=140 TurnOffLi ...

  10. Go基础之函数递归实现汉诺塔

    Go递归实现汉诺塔 package main import "fmt" // a 是源,b 借助, c 目的长度 func tower(a, b, c string, layer ...