1、饿汉式实现单例模式
package com.muluo.singleton;
/*
*
* 单例模式:单个实例
* 饿汉模式方法创建
*
* 饿汉式与懒汉式的区别:
* ①:懒汉式:好处,延迟对象的创建, 坏处: 线程不安全的(目前这个不安全,不建议写)
* ②:饿汉式:坏处,对象加载时间过长, 好处: 线程安全的 java.lang.Runtime
*
* 单例模式的运用:日志,数据库的链接池,windows下的回收站
* */
// 饿汉式实现单例模式 (一上来就创建一个对象)
public class singletonTest1 {
public static void main(String[] args) {
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank1 == bank2); // true 证明两个实例的地址一样,即为一个对象
}
}
class Bank{
// ①私有类的构造器
private Bank() {
}
// ②内部创建类的对象
// ④要求次对象也必须声明为为静态的
private static Bank instance = new Bank();
// ③提供公共的静态方法,返回实例对象:如果不是静态的,那么调用只能创建一个实例对象去调用次此方法,
public static Bank getInstance(){
return instance;
}
}
2、懒汉式实现单例模式
package com.muluo.singleton;
import sun.security.jca.GetInstance;
// 懒汉式实现单例模式 用的时候才创造
public class singletonTest2 {
public static void main(String[] args) {
Order order1 = Order.getInstance();
Order order2 = Order.getInstance();
// 地址一样,说明是同一个对象,== 用于引用数据类型比较的是地址
System.out.println(order1 == order2);
}
}
class Order{
// 私有类的构造器
private Order(){
}
// 声明当前类的对象,不进行初始化
// 此对象也必须为静态的
private static Order instance = null;
// 声明一个静态的返回类的对象方法
public static Order getInstance(){
// 如果不加判断语句则会调用一次就创建一次
if(instance == null) {
instance = new Order();
}
return instance;
}
}
3、使用同步机制将单例模式中的懒汉式改写为线程安全的。
class Bank{
private Bank(){}
private static Bank instance = null;
public static Bank getInstance(){
//方式一:效率稍差
// synchronized (Bank.class) {
// if(instance == null){
//
// instance = new Bank();
// }
// return instance;
// }
//方式二:效率更高
if(instance == null){
synchronized (Bank.class) {
if(instance == null){
instance = new Bank();
}
}
}
return instance;
}
}