单例模式
单例模式是为了只构建一个实例对象,Single类中instance,在此类中只有这一个实例对象。还有一点是构造函数私有化,为了防止在外部通过new产生对象。
package singleton;
public class SingletonTest {
public static void main(String[] args) {
Singleton instance1=Singleton.getInstance();
Singleton instance2=Singleton.getInstance();
System.out.print(instance1==instance2);
}
}
以上是客户端测试案例,输出true。
package singleton;
public class Singleton {
// 饿汉式创建
public static Singleton instance=new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
饿汉式创建实例对象,在类加载的时候就已经创建了,效率不高,占用内存。还有一种饿汉式创建是使用static静态代码块赖实例一个对象。
package singleton;
public class Singleton {
// 饿汉式创建
public static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
package singleton;
public class Singleton {
// 饿汉式创建
public static Singleton instance=null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
以上方式属于赖汉式创建实例对象,先将静态对象赋值null,在静态方法getInstance()中,先判断是否为空,如果为空,new一个对象,不为空的情况下直接返回instance实例。但在这种创建的情况下,会有线程不安全的情况发生,当一个线程加入if语句块创建实例对象的时候,其它线程也到了if判断语句块,在这种情况下,就会生产两个实例对象。
解决的方法可以在方法前面加一个synchronized关键字。
package singleton;
public class Singleton {
// 饿汉式创建
public static Singleton instance=null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
使用synchronized,防止线程不安全,这样做有一个缺点是产生单例对象效率不高。两个线程对象同时调用getInstance方法,先来的先执行,其它线程就会在内存中等待执行的线程执行完毕才开始执行。