单例模式
Singleton,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
–饿汉式
package com.monster.fx;
//测试 单例 设计模式
public class Test3 {
public static void main(String[] args) {
MySingle m1 = MySingle.get();
MySingle m2 = MySingle.get();
//比较m1和m2的地址值,是否相等.如果是同一个对象地址值相同
//equals()--默认使用了Object提供的,使用==比较地址值,可以重写,改成比属性值
//==用来比基本类型的值本身,比引用类型的地址值
System.out.println( m1 == m2 );
}
}
//创建类 --保证一个类仅有一个实例
class MySingle {
//1, 私有化构造方法
private MySingle(){}
//2,自己new一个
//加static是因为,被静态方法get() 调用的资源 也必须 是静态的
static private MySingle my = new MySingle();
//3,给外界提供一个get(),把my返回
//加static 是因为,可以通过类名调用
static public MySingle get(){
return my ;//把my返回
}
}
–懒汉式(更常用)
package com.monster.fx;
public class Test4 {
public static void main(String[] args) {
}
}
懒汉式 -- 延迟加载/按需加载 + 线程安全问题
//在多线程并发操作数据时,,,数据到底是否存在线程安全的隐患??
//共享数据,有没有 被多条语句操作.
class MySingle2{
private MySingle2(){}
//1, 懒汉式,不会第一时间把对象创建出来占用内存
static private MySingle2 my ;
//3,解决 共享资源的 线程安全隐患 -- 加锁
//如果锁的是普通资源,锁对象可以任意,只要是同一个就可以
//如果锁的是静态资源,锁对象必须是, 类名.class
//4,静态方法的锁对象,分配的是 -- 类名.class
synchronized static public MySingle2 get(){
//2, 懒汉式,在执行get()时才开始创建对象
if(my == null){//没创建过的话,才创建.创建过了,就不再创建了...
my = new MySingle2();
}
return my;
}
}