java设计模式:单例模式【Singleton Pattern】



单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是 private 的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个 B/S 项目中,每个 HTTPRequest 请求到 J2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象。

/**

* I‘m glad to share my knowledge with you all.

* 中国的历史上一般都是一个朝代一个皇帝,有两个皇帝的话,必然要PK出一个皇帝出来

*/

public classEmperor {

private staticEmperor emperor= null; //定义一个皇帝放在那里,然后给这个皇帝名字

privateEmperor(){

//世俗和道德约束你,目的就是不让你产生第二个皇帝

}

public static EmperorgetInstance(){

if(emperor== null){ //如果皇帝还没有定义,那就定一个

emperor= newEmperor();

}

return emperor;

}

//皇帝叫什么名字呀

public static voidemperorInfo(){

System.out.println("我就是皇帝某某某....");

}

}

然后定义大臣:

/**

* I‘m glad to share my knowledge with you all.

* 大臣是天天要面见皇帝,今天见的皇帝和昨天的,前天不一样那就出问题了!

*/

@SuppressWarnings("all")

public classMinister {

/**

* @param args

*/

public static voidmain(String[] args) {

//第一天

Emperor emperor1=Emperor.getInstance();

emperor1.emperorInfo(); //第一天见的皇帝叫什么名字呢?

//第二天

Emperor emperor2=Emperor.getInstance();

Emperor.emperorInfo();

//第三天

Emperor emperor3=Emperor.getInstance();

emperor2.emperorInfo();

//三天见的皇帝都是同一个人,荣幸吧!

}

}

单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是 private 的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个 B/S 项目中,每个 HTTPRequest 请求到 J2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?,好,我们写一个通用的单例程序,然后分析一下:

/**

* I‘m glad to share my knowledge with you all.

* 通用单例模式

*/

@SuppressWarnings("all")

public classSingletonPattern {

private staticSingletonPattern singletonPattern= null;

//限制住不能直接产生一个实例

privateSingletonPattern(){

}

publicSingletonPattern getInstance(){

if(this.singletonPattern== null){ //如果还没有实例,则创建一个

this.singletonPattern= newSingletonPattern();

}

return this.singletonPattern;

}

}

假如现在有两个线程 A 和线程 B,线程 A 执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要 0.001 微秒,就在这 0.001 微秒之内,线程 B 执行到 if(this.singletonPattern == null),你说这个时候这个判断条件是 true 还是 false?是 true,那然后呢?线程 B 也往下走,于是乎就在内存中就有两个 SingletonPattern 的实例了,看看是不是出问题了?

如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:

/**

* I‘m glad to share my knowledge with you all.

* 通用单例模式

*/

@SuppressWarnings("all")

public classSingletonPattern {

private static finalSingletonPattern singletonPattern= new

SingletonPattern();

//限制住不能直接产生一个实例

privateSingletonPattern(){

}

public synchronized staticSingletonPattern getInstance(){

return singletonPattern;

}

}

直接 new 一个对象传递给类的成员变量 singletonpattern,你要的时候 getInstance()直接返回给你,解决问题!

时间: 2024-11-05 14:37:22

java设计模式:单例模式【Singleton Pattern】的相关文章

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

JAVA设计模式-单例模式(Singleton)线程安全与效率

一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式进行探索的. 本文的目的是:结合文章中的八种单例模式的写法,使用实际的示例,来演示线程安全和效率 既然是实际的示例,那么就首先定义一个业务场景:购票.大家都知道在春运的时候,抢票是非常激烈的.有可能同一张票就同时又成百上千的人同时在抢.这就对代码逻辑的要求很高了,即不能把同一张票多次出售,也不能出现

设计模式之单例模式Singleton pattern

单例模式Singleton pattern 一种软件设计模式.在核心结构中只包含一个被称为单例的特殊类. 一个类只有一个对象实例,并且自行实例化向整个系统提供. 动机 一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器.如在Windows中就只能打开一个任务管理器.如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源:如果这些窗口显示的内容不

二十四种设计模式:单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using System.Collections.Generic; using System.Text; namespace Pattern.Singleton { /// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name=&q

Java设计模式の单例模式

-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱汉式,非线程安全 c.饱汉式,线程安全简单实现 d.线程安全 并且效率高  单例模式最优方案 3.总结 a.使用枚举的单例模式 b.使用枚举,static处调用,初始化一次 -------------------------------------------------- 1.定义 确保一个类只有

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

ninject学习笔记二:单例模式singleton pattern

今天准备学习singleton pattern,顾单词思含义,就是一个实例的意思.单例的实现思路是:私有化构造函数,提供公有方法获取类的实例.下面定义一个音乐播放器类MusicPlayer,观察单例的实现方法 class MusicPlayer { private static readonly MusicPlayer player = new MusicPlayer(); private MusicPlayer() { } public static MusicPlayer GetInstan

单态设计模式(Singleton pattern)

单态(单例)设计模式 单态设计模式(Singleton pattern)就是要保证在整个程序中某个类只能存在一个对象,这个类不能再创建第二个对象. 单态设计模式的写法 私有化构造函数,阻止创建新对象. 单例设计模式: 在内存中对象只有一个存在. */ //饿汉式 class Student { private Student(){} private static Student s = new Student(); public static Student getInstance() { re

.NET设计模式实例之单例模式( Singleton Pattern)

一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它. 二.解决的问题(What To Solve) 当一个类只允许创建一个实例时,可以考虑使用单例模式. 三.单例模式分析(Analysis)1.单例模式结构 Singleton类,定义一个私有变量instance;私有构造方法Singleton(