单例模式基本要点:

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

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

(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. PAT甲级——A1107 Social Clusters

    When register on a social network, you are always asked to specify your hobbies in order to find som ...

  2. Django高级实战 开发企业级问答网站✍✍✍

    Django高级实战 开发企业级问答网站 1. 创建项目与app 创建项目 django-admin startproject firstsite 创建app python manage.py sta ...

  3. django汉化

    汉化admin后台管理站点 修改settings文件(将上表格内容改变为下表格): LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' LANGUAGE_CODE = ...

  4. [WPF自定义控件库] 让Form在加载后自动获得焦点

    原文:[WPF自定义控件库] 让Form在加载后自动获得焦点 1. 需求 加载后让第一个输入框或者焦点是个很基本的功能,典型的如"登录"对话框.一般来说"登录" ...

  5. 01.MyBatis快速入门

    1.下载jar包 Mybatis包+数据库驱动包 https://github.com/mybatis/mybatis-3/releases 2.新建Java工程并导入jar包 3.创建数据库与表 C ...

  6. 廖雪峰Java13网络编程-3其他-2RMI远程调用

    1.RMI远程调用: Remote Method Invocation 目的:把一个接口方法暴露给远程 示例: 定义一个接口Clock,它有一个方法能够获取当前的时间,并编写一个实现类,来实现这个接口 ...

  7. 爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址

    import requests address = '40.8587960,86.866991' url = 'http://api.map.baidu.com/geocoder?output=jso ...

  8. dijkstra (模板)

    突然意识到以前写的都是假的dij,感谢GhostCai神犇. #include<iostream> #include<cstdio> #include<cstring&g ...

  9. Android基础控件ListView和自定义BaseAdapter适配器

    1.简介 ListView用于列表显示,相当于OC中的TableView,和适配器一块使用,相关属性: footerDividersEnabled:是否在footerView(表尾)前绘制一个分隔条, ...

  10. shell脚本实现读取一个文件中的某一列,并进行循环处理

    shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...