懒汉式:
在第一次调用时才会创建实例化对象,只适用于单线程模式。当在多线程中,如果多个线程同时进行,就会实例化多个对象。
懒汉式创建模式:
//懒汉式
public class Person {
public static Person p;
private Person(){}//
public static Person getInstance(){
if(p==null){
p=new Person();//在第一次调用时创建
}
return p;//返回实例化对象
}
}
举例:卖票
public class Person {
public static Person p;
int ticket=10;//余票
public static Person getInstance(){
if(p==null){
p=new Person();
}
return p;
}
public void setTicket(){
ticket--;
}
}
测试类:
public class Test{
public static void main(String[] args) {
Runnable r=new Runnable() {
@Override
public void run() {
Person.getInstance().setTicket();
System.out.println("卖出一张,还剩"+Person.getInstance().ticket);
}
};
Thread t1=new Thread(r);
Thread t2=new Thread(r);
t1.start();//开启线程1
t2.start();//开启线程2
}
}
如果多个线程同时进行时,
if(p==null){
p=new Person();
}
同时执行到了这段代码,判断都为null,那么就会创建2个对象。
此时就有2个地方进行了卖票,但原本只有10张票 。这时候就产生了一个位置却卖出了2张票。
饿汉式:
在类加载时本身就已经创建好了一个对象,因为构造方法私有化,所以不会被外界所实例化,只会有一个实例化对象。
饿汉式创建模式:
//饿汉式
public class Person {
public static Person p=new Person();//类加载时就创建一个对象
private Person(){}//构造方法私有化,不被外界所创建对象
public static Person getInstance(){
return p;//返回实例化对象
}
}