单例模式(饿汉式,懒汉式)
单例模式:在整个java程序运行过程中,某个类自始至终只允许存在一个对象
两种写法:
饿汉式:在类的加载过程中,该类的对象就已经存在了。
懒汉式:类不调用方法,内存始终没有该类的对象,可能存在线程安全的问题。synchronized
详细见如下代码:
class ErHan{private static ErHan erHan=new ErHan();private ErHan() {}public static ErHan getErHan(){return erHan;}}
class xianCheng extends Thread{public xianCheng() {}@Overridepublic void run() {//run没有返回值,无法知晓两个对象是否相同,可以打印出来
// LanHan l = LanHan.getLanHan();
// System.out.println(l);//run没有返回值,无法知晓两个对象是否相同,可以重新定义一个有返回值的方法GET()GET();}public static LanHan GET(){LanHan lanHan = LanHan.getLanHan();return lanHan;}
}
class LanHan {private LanHan(){}private static LanHan lanHan;//懒汉是不调用方法,就不执行,存在线程安全问题,可以加同步锁 synchronized 保证安全public static LanHan getLanHan(){if(lanHan==null){lanHan = new LanHan();}return lanHan;}}public class Single {public static void main(String[] args) {ErHan e1 = ErHan.getErHan();ErHan e2 = ErHan.getErHan();System.out.println("饿汉抢:"+e2.equals(e1));//单例模式,每次只允许一个对象,e2==e1//因为构造方法私有,无法new,即使继承Thread或者实现其他接口,也无法new出对象来执行线程//所以重新定义一个子类线程,在去抢LanHan的getLanHan方法xianCheng x1 = new xianCheng();xianCheng x2 = new xianCheng();x1.start();x2.start();System.out.println("懒汉抢:"+x1.GET().equals(x2.GET()));}
}
