单例模式----懒汉式的三种实现方式
实现单例模式共有8中方法,其中不推荐使用,或者设计不合理的单例模式有以下三种
线程不安全式懒汉式
package com.design_patterns.singleton;
/**
* 懒汉式(线程安全,但效率低下哦)
*/
class Person04{
private static Person04 person = null;
private Person04(){} //对构造方法进行私有化
/**
* 定义getInstance()静态方法,可以直接通过此类调用此方法获取此类的实例化对象
* 此方法加入了synchronized关键字,因此不会出现线程安全问题
* @return
*/
public static synchronized Person04 getInstance(){
if(person == null){ //判断person对象是否存在,若不存在为null,才进行创建
person = new Person04();
}
return person;
}
}
public class SingletonType04 {
public static void main(String[] args) throws Exception {
Person04 person = Person04.getInstance(); //根据Person04类中的静态方法获取实例
Person04 person04 = Person04.getInstance();
System.out.println("主线程Person04类的对象person是:\n" + person + "\n" + person.hashCode());
System.out.println("主线程Person04类的对象person04是:\n" + person + "\n" + person.hashCode());
System.out.println("这两个对象一样么?" + (person == person04));
}
}
/**
运行结果:
主线程Person03类的对象person是:
com.design_patterns.singleton.Person04@4554617c
1163157884
主线程Person04类的对象person04是:
com.design_patterns.singleton.Person04@4554617c
1163157884
这两个对象一样么?true
*/
优缺点说明
线程安全懒汉式
package com.design_patterns.singleton;
/**
* 懒汉式(线程不安全)
* 错误的写法,不能采用此种方式
*/
class Person05{
private static Person05 person = null;
private Person05(){} //对构造方法进行私有化
/**
* 定义getInstance()静态方法,可以直接通过此类调用此方法获取此类的实例化对象
* 但是当多个线程同时进行执行此方法时,就会有多个实例化对象产生,因此采用此种方法创建单例模式了是不安全的
* @return
*/
public static Person05 getInstance(){
if(person == null){ //判断person对象是否存在,若不存在为null,才进行创建
synchronized (Person05.class){ //将实例化操作放入代码块中,但是此种操作依然无法解决线程安全问题
person = new Person05();
}
}
return person;
}
}
public class SingletonType05 {
public static void main(String[] args) throws Exception {
Person05 person = Person05.getInstance(); //根据Person04类中的静态方法获取实例
Person05 person05 = Person05.getInstance();
System.out.println("主线程Person05类的对象person是:\n" + person + "\n" + person.hashCode());
System.out.println("主线程Person05类的对象person05是:\n" + person + "\n" + person.hashCode());
System.out.println("这两个对象一样么?" + (person == person05));
}
}
/**
主线程Person05类的对象person是:
com.design_patterns.singleton.Person05@4554617c
1163157884
主线程Person05类的对象person05是:
com.design_patterns.singleton.Person05@4554617c
1163157884
这两个对象一样么?true
*/
优缺点说明
线程不安全懒汉式(使用错误)
package com.design_patterns.singleton;
/**
* 懒汉式(线程不安全)
* 错误的写法,不能采用此种方式
*/
class Person05{
private static Person05 person = null;
private Person05(){} //对构造方法进行私有化
/**
* 定义getInstance()静态方法,可以直接通过此类调用此方法获取此类的实例化对象
* 但是当多个线程同时进行执行此方法时,就会有多个实例化对象产生,因此采用此种方法创建单例模式了是不安全的
* @return
*/
public static Person05 getInstance(){
if(person == null){ //判断person对象是否存在,若不存在为null,才进行创建
synchronized (Person05.class){ //将实例化操作放入代码块中,但是此种操作依然无法解决线程安全问题
person = new Person05();
}
}
return person;
}
}
public class SingletonType05 {
public static void main(String[] args) throws Exception {
Person05 person = Person05.getInstance(); //根据Person04类中的静态方法获取实例
Person05 person05 = Person05.getInstance();
System.out.println("主线程Person05类的对象person是:\n" + person + "\n" + person.hashCode());
System.out.println("主线程Person05类的对象person05是:\n" + person + "\n" + person.hashCode());
System.out.println("这两个对象一样么?" + (person == person05));
}
}
/**
主线程Person05类的对象person是:
com.design_patterns.singleton.Person05@4554617c
1163157884
主线程Person05类的对象person05是:
com.design_patterns.singleton.Person05@4554617c
1163157884
这两个对象一样么?true
*/
优缺点说明