浅谈单例模式
单例模式的定义
单例模式是为了确保某个类只有一个实例,并且自行实例化向整个系统提供这个实例。就比如计算机的任务管理器、打印机、显卡驱动等都被设计成了单例模式。选择使用单例模式就是为了避免不一致的状态。
单例模式的特点
单例类只能有一个实例对象。 单例类必须自己创建一个自己的唯一实例。 单例类必须给其他对象提供这一实例。 单例模式保证了全局对象的唯一性,就比如电脑打印文件一样,同时只能向一个打印机发送请求。
线程安全问题
在获取单例的时候,要保证只能产生一个实例对象 使用单例对象时要猪一样单例对象内的实例变量会被多个线程共享,推荐使用无状态对象,不会因为多个线程的交替调度而破坏自身的状态导致线程安全问题。
实现单例模式的方法
public class Single {
private static final Single single = new Single ( ) ;
private Single ( ) {
}
public static Single getSingle ( ) {
return single;
}
}
饿汉式单例在类加载的时候就会创建一个静态对象供外部使用,除非系统重启,这个对象时不会改变的,所以线程本身是安全的。
public class Single1 {
private static Single1 single1 = null;
private Single1 ( ) {
}
public static Single1 getSingle ( ) {
if ( single1== null) {
single1 = new Single1 ( ) ;
}
return single1;
}
}
懒汉式虽然使用延迟创建实例对象的方式,但在多线程情况下会创建对个实例对象,所以说在多线程下是不安全的。 使用sunchronized加上同步锁,就可以解决多线程的问题
public class Single1 {
private static Single1 single1 = null;
private Single1 ( ) {
}
public synchronized static Single1 getSingle ( ) {
if ( single1== null) {
single1 = new Single1 ( ) ;
}
return single1;
}
}