java单件模式
2014-03-04 21:11
218 查看
单件模式:就是一个类只有一个实例,并提供一个全局访问点。
单件模式浅显易懂,一般的实现形式如下所示:public class Earth {
private static Earth uniEarth;
public static Earth getInstance(){
if(uniEarth == null){
uniEarth = new Earth();
}
return uniEarth;
}
}
但是在多个线程操作的情况下,该方法显然有问题;比如:线程1执行到if语句的时候,跳出线程执行线程2的时候,那么就会出现错误。
一般有三种解决方法:
方法一:
对方法加锁,但是会降低性能//同一个方法可能会造成程序的执行效率下降100倍,因此如果getInstance()使用频繁的时候,就尽量避免该做法;
方法二:
如果应用程序总是要创建该单间实例或者创建或运行时的负担不太繁重,可以在jvm加载类的时候马上创建此唯一的单件实例。
方法三:
用“双重检查加锁”,在getInstance()中减少使用同步,这样的话,只有第一次会同步。
public class Earth {
private volatile static Earth uniEarth;
public static Earth getInstance(){
if(uniEarth == null){
synchronized(Earth.class){
uniEarth = new Earth();
}
}
return uniEarth;
}
}
volatile关键字:保证线程从对象的引用找到对应在堆内存的变量的值是最新的哈;详细的介绍可以查看转载的java中volatile关键字的解析博客;
单件模式浅显易懂,一般的实现形式如下所示:public class Earth {
private static Earth uniEarth;
public static Earth getInstance(){
if(uniEarth == null){
uniEarth = new Earth();
}
return uniEarth;
}
}
但是在多个线程操作的情况下,该方法显然有问题;比如:线程1执行到if语句的时候,跳出线程执行线程2的时候,那么就会出现错误。
一般有三种解决方法:
方法一:
public static synchronized Earth getInstance(){}
对方法加锁,但是会降低性能//同一个方法可能会造成程序的执行效率下降100倍,因此如果getInstance()使用频繁的时候,就尽量避免该做法;
方法二:
public class Earth { private static Earth uniEarth = Earth(); public static Earth getInstance(){ return uniEarth; } }
如果应用程序总是要创建该单间实例或者创建或运行时的负担不太繁重,可以在jvm加载类的时候马上创建此唯一的单件实例。
方法三:
用“双重检查加锁”,在getInstance()中减少使用同步,这样的话,只有第一次会同步。
public class Earth {
private volatile static Earth uniEarth;
public static Earth getInstance(){
if(uniEarth == null){
synchronized(Earth.class){
uniEarth = new Earth();
}
}
return uniEarth;
}
}
volatile关键字:保证线程从对象的引用找到对应在堆内存的变量的值是最新的哈;详细的介绍可以查看转载的java中volatile关键字的解析博客;
相关文章推荐
- java设计模式之单件模式Singleton
- java设计模式——单件模式
- 单件模式——JAVA的两种实现
- java单件模式
- java 单件模式
- 多线程单件模式-Java
- java 单例模式 单件模式 Singleton
- java单件模式
- 浅析设计模式之单件模式 java 单例模式
- JAVA基础(四)设计模式总结及单件模式
- 多线程安全的Singleton单件模式在C++,java与C#下的实现
- Java设计模式——单件模式
- Java设计模式——单件模式
- java 实现支持多线程的单件模式
- Java设计模式——线程安全的单件模式
- 设计模式中单件模式的学习记录-java
- 单件模式(java)
- 单件模式 java
- Java学习笔记-单件模式
- JAVA设计模式之单件模式