单例模式又可分为恶汉式和懒汉式:
恶汉式实现方法:
package com.dx.demo;
/**
* 单例模式-恶汉模式
* @author xiangzi
*
*/
public class SingleDemo1 {
private static SingleDemo1 single = new SingleDemo1();
//构造方法私有化
private SingleDemo1(){}
//获取单例对象
public static SingleDemo1 getInstance(){
return single;
}
//其他方法
public void otherMetod(){
System.out.println("other methods ........");
}
}
package com.dx.demo;
/**
* 测试
* @author xiangzi
*
*/
public class MainTest {
public static void main(String[] args) {
SingleDemo1 single1 = SingleDemo1.getInstance();
SingleDemo1 single2 = SingleDemo1.getInstance();
System.out.println(single1 == single2);
System.out.println("==============================");
single1.otherMetod();
}
}
测试结果:
true
==============================
other methods ........
懒汉式实现:
package com.dx.demo;
/**
* 单例模式-懒汉模式
*
* @author xiangzi
*
*/
public class SingleDemo2 {
private static SingleDemo2 single = null;
//构造方法私有化
private SingleDemo2(){}
//获取单例对象
public static SingleDemo2 getInstance(){
//多线程下,利用synchronized解决同步问题
synchronized (SingleDemo2.class) {
if(single == null){
single = new SingleDemo2();
}
}
return single;
}
//其他方法
public void otherMetod(){
System.out.println("other methods ........");
}
}
package com.dx.demo;
/**
* 测试
* @author xiangzi
*
*/
public class MainTest {
public static void main(String[] args) {
SingleDemo2 single1 = SingleDemo2.getInstance();
SingleDemo2 single2 = SingleDemo2.getInstance();
System.out.println(single1 == single2);
System.out.println("==============================");
single1.otherMetod();
}
}
测试结果:
true
==============================
other methods ........
总结:恶汉模式下,由于当前对象一旦被jvm加载,就会产生该类的实例(不管有用没用,先生成实例,所以是恶汉式),以后获取的都是统一对象,不会产生多线程下产生多个实例。而懒汉式由于只有该类被引用式,才会创建实例,所以需要解决多线程情况下的资源同步问题。