单例设计模式
所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例
记忆技巧:懒汉式—太懒了,什么时候用,什么时候造
饿汉式—太饿了,上来直接造好
1.饿汉式
package com.danli;
public class Singleton01 {
public static void main(String[] args) {
Bank bank = Bank.getBank();
Bank bank1 = Bank.getBank();
System.out.println(bank==bank1);
}
}
class Bank{
//1.私有化类的构造器(禁止其它类调用)
private Bank() {
}
//2.内部创建类的对象(必须是静态的)
private static Bank bank = new Bank();
//3.提供公共的静态方法,返回类的对象
public static Bank getBank() {
return bank;
}
}
2.懒汉式
下面这种方法的线程是不安全的
package com.danli;
public class Singleton02 {
public static void main(String[] args) {
Supermarket supermarket = Supermarket.getSupermarket();
Supermarket supermarket1 = Supermarket.getSupermarket();
System.out.println(supermarket==supermarket1);
}
}
class Supermarket{
//1.私有化类的构造器
private Supermarket() {
}
//2.声明当前类对象,不初始化(静态的)
private static Supermarket supermarket = null;
//3.声明public,static的返回当前类对象的方法
public static Supermarket getSupermarket() {
if (supermarket==null){
supermarket = new Supermarket();
}
return supermarket;
}
}
以下,在getSupermarket方法上加上同步,此时线程是安全的
package com.danli;
public class Singleton02 {
public static void main(String[] args) {
Supermarket supermarket = Supermarket.getSupermarket();
Supermarket supermarket1 = Supermarket.getSupermarket();
System.out.println(supermarket==supermarket1);
}
}
class Supermarket{
//1.私有化类的构造器
private Supermarket() {
}
//2.声明当前类对象,不初始化(静态的)
private static Supermarket supermarket = null;
//3.声明public,static的返回当前类对象的方法
public static synchronized Supermarket getSupermarket() {
if (supermarket==null){
supermarket = new Supermarket();
}
return supermarket;
}
}
3.两者的对比
饿汉式:对象加载时间过长,线程是安全的
懒汉式:延迟对象的创建,线程不安全(第一种写法)