单例模式
单例模式–饿汉试
/*
* 单例模式——饿汉试
*/
class Test{
public static void main(String[] args) {
// TODO Auto-generated method stub
SingleDemo1 singleDemo1 = SingleDemo1.getInstance();
//这个位置无论创建多少个singleDemo1,都只对应一个内存地址,所以称为饿汉试
}
}
public class SingleDemo1 {
//类加载的时候会立刻创建一个对象,而且私有,所以但饿汉试的单例
private static final SingleDemo1 instance = new SingleDemo1();
//构造器私有化,如果不私有外界想new几个就可以new几个,就失去了单例的意义
private SingleDemo1(){
}
public static SingleDemo1 getInstance(){
return instance;
}
}
单例模式——懒汉式
package com.briup.day19;
/*
* 单例模式——懒汉式(在使用时才加载,因此称为懒汉式)
*/
class Test2{
public static void main(String[] args) {
// TODO Auto-generated method stub
SingleDemo1 singleDemo2 = SingleDemo1.getInstance();
}
}
public class SingleDemo2 {
private static SingleDemo2 instance = null;
//构造器私有化,如果不私有外界想new几个就可以new几个,就失去了单例的意义
private SingleDemo2(){
}
public static SingleDemo2 getInstance(){
if(instance == null){
//在使用时候会才创建一个对象,而且私有,所以但懒汉试的单例
//这种写法属于线程不安全 写法 ,因为等A进到这个位置时没来的急new然后B来了,这样就会
//不过上面加个synchronized修饰就好安全了public static synchronized SingleDemo2 getInstance(){
synchronized (SingleDemo2.class){
if(instance == null){
return instance =new SingleDemo2();
}
}
//不过这里为了尽量少的在锁里写代码,采用双重检查机制
}
return instance;
}
}