java单例模式
java单例模式是java中经常使用到的一种情况,那么,要实现单例模式都有哪几种方法呢,下面介绍的是java单例模式的四种实现方法,分别是:
懒汉式 饿汉式 双检锁 静态内部类
懒汉式
懒汉式故名思意就是懒,是等到需要使用的时候再创建单例。这就需要将构造函数私有化,在外部就不能创建对象,由内部创建。下面是懒汉模式的实现。
/**
* 懒汉式
* 单例模式的创建
*/
public class SingleDemo {
public static SingleDemo singleDemo=null;
private SingleDemo() {
}
public static SingleDemo getInstance(){
if(singleDemo==null){
singleDemo=new SingleDemo();
return singleDemo;
}else {
return singleDemo;
}
}
}
懒汉模式虽然简便也好理解,但是有线程安全的问题,当多个线程同时并发调用getInstance()函数时可能出现多列对象。
饿汉式
饿汉式故名思意就是处于饥饿状态,类初始化一开始就创建出一个单列,当要使用时通过类函数获取得到。
/**
* 饿汉式
* 单例模式的创建
* 在类加载时创建单例
*/
public class SingleDemo {
public static SingleDemo singleDemo=null;
//私有化构造函数,使其不能在外部构造
private SingleDemo(){}
static {
singleDemo=new SingleDemo();
}
public static SingleDemo getInstance(){
return singleDemo;
}
}
双检锁
为了解决懒汉式带来的线程安全问题,我们使用加锁的方式来同步代码。
代码的设计如下:
package quartz;
/**
* 懒汉式加强版-双检锁
* 在需要使用时创建单例
*/
public class SingleDemo {
public static SingleDemo singleDemo=null;
//私有化构造函数,使其不能在外部构造
private SingleDemo(){}
public static SingleDemo getInstance(){
//判单是否为首次创建实例
if(singleDemo==null){
//同步代码块,使得同一个SingleDemo类在加载这段代码时同步
synchronized (SingleDemo.class){
//再次判断实例是否被创建
if(singleDemo==null){
singleDemo=new SingleDemo();
return singleDemo;
}else {
return singleDemo;
}
}
}else {
return singleDemo;
}
}
}
双检锁实现了对懒汉模式的加强,防止了单例模式的线程安全问题。
静态内部类
静态内部类实现单例模式如图下:
/**
* 静态内部类
* 随静态内部类加载创建
*/
public class SingleDemo {
private SingleDemo(){}
public static class SingleDemo1{
private static final SingleDemo Instance=new SingleDemo();
}
public static final SingleDemo getInstance(){
return SingleDemo1.Instance;
}
}
实例随静态内部类的类加载而创建,从而只有一个单例