java单例模式,
java单例模式,
概念:
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例
单例模式有以下特点:
1.单例类只能有一个实例
2.单例类必须自己创建自己的唯一实例
3.单例类必须给所有其他对象提供这一实例
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,
线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或
少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个
打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当几种管理这些通信端口,以
避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
经典的单例实现
public class Singleton{
private static Singleton single = null;
private Singleton(){
//Exist only to default instantiation
}
public static Singleton getInstance(){
if(single == null){
single = new Singleton();
}
return single;
}
//other methods
}
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的
唯一实例只能通过getInstance()方法访问。(事实上,通过java反射机制是能够实例化构造方法为private的类的
,那基本上会使所有的java单例实现失效。)
但是以上实现没有考虑到线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程同时
运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行结果是一样的,而且其它的变量的
值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者
多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上的实现
并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。
/*验证单例模式的例子*/
package singleton;
public class Singleton {
private String name;
private static Singleton single = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(single == null){
single = new Singleton();
}
return single;
}
public void message(){
System.out.println("message:" + this.name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package singleton;
public class TestSingle {
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
s1.setName("张三 1");
System.out.println(s1.getName());
Singleton s2 = Singleton.getSingleton();
s2.setName("张三 2");
System.out.println(s2.getName());
s1.message();
s2.message();
if(s1 == s2){
System.out.println("创建的是同一个实例");
}else{
System.out.println("创建的不是同一个实例");
}
}
}
运行结果如下:
张三 1
张三 2
message:张三 2
message:张三 2
创建的是同一个实例
相关文章
- 暂无相关文章
用户点评