单例模式:在整个java程序运行过程中,某个类自始至终只允许存在一个对象
两种写法:
饿汉式: 在类的加载过程中,该类的对象就已经存在了。
懒汉式:类不调用方法,内存始终没有该类的对象,可能存在线程安全的问题。synchronized
详细见如下代码:
java
class ErHan{
private static ErHan erHan=new ErHan();
private ErHan() {
}
public static ErHan getErHan(){
return erHan;
}
}
class xianCheng extends Thread{
public xianCheng() {
}
@Override
public 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()));
}
}