java单态模式讲解
来源:互联网 发布:淘宝砖石展位 编辑:程序博客网 时间:2024/05/22 16:47
单态定义:
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
使用Singleton注意事项:
有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的
单态模式的演化:
单态模式是个简单的模式,但是这个简单的模式也有很多复杂的东西。
单态模式一:
i)
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
ii)等同于上一种
public class Singleton {
//注意这是private 只供内部调用
private Singleton(){}
private static Singleton instance;
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
注意:这个单态模式是不安全的,为什么说呢 ?因为没考虑多线程,如下情况
Thread 1 调用getInstance() 方法,并且判断instance是null,然後进入if模块,在实例化instance之前,Thread 2抢占了Thread 1的cpu。Thread 2 调用getInstance() 方法,并且判断instance是null,然後进入if模块,Thread 2 实例化instance 完成,返回Thread 1 再次实例化instance。这个单态已经不在是单态
单态模式二:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例!
if (instance==null)
instance=new Singleton();
return instance; }
}
注: 采用同步来解决,这种方式解决了问题,但是仔细分析正常的情况下只有第一次时候,进入对象的实例化,须要同步,其它时候都是直接返回已经实例化好的instance不须要同步,大家都知到在一个多线程的程序中,如果同步的消耗是很大的,很容易造成瓶颈 。更好的办法这里暂不研究。一般来说不涉及到多线程可优先选择第一种方式。
- java单态模式讲解
- java单态模式讲解
- java 单例模式讲解
- JAVA中的工厂模式和单例模式讲解
- 单例模式讲解
- 单例模式讲解
- 单例模式讲解
- 单利模式android,java中的单例模式。简单讲解单例模式
- 深入浅出讲解单例模式(java实现)
- 单例模式懒汉式与饿汉式java讲解
- 【转载】java中的单例模式详细讲解
- Java 单态模式
- Java单态模式
- java单例讲解
- PHP单例模式讲解
- 单例设计模式讲解
- 单例模式--实例讲解
- 单例模式讲解应用
- 获取request里的所有参数名及其参数值(参数名自动获取)
- java值传递与引用传递
- 抓取excel里某个sheet的数据到datagridview里
- 中电信低调推出微博网站
- 动态的tree ajax
- java单态模式讲解
- select 语法
- Linux/WinCE C、C++高端课程
- 提交多行数据到Struts的ActionForm的List属性中
- CString, BSTR, LPCTSTR 概念--leo断定->猛贴
- 程序员们纷纷表示“内牛满面”-VS2010视频共5季
- [C/C++] 把一个整型整数转成字符串
- vs2008验证控件的用法
- js 裁剪字符串