单例设计模式
- 作用: 在应用程序有保证最多只能有一个实例.
- 好处:
2.1 提升运行效率.
2.2 实现数据共享. 案例:application 对象
- 懒汉式
3.1 对象只有被调用时才去创建.
3.2 示例代码
3.3由于添加了锁,所以导致效率低.
public class lazySingleton { //懒汉式,单例模式!
//由于对象需要被静态方法调用,把方法设置为static
//由于对象是static,必须要设置访问权限修饰符为private ,
//如果是public 可以直接调用对象,不执行访问入口
private static lazySingleton ourInstance ;
/**
*方法名和类名相同,无返回值.
*其他类不能实例化这个类对象;对外提供访问入口
*/ private lazySingleton() {
}
/** *实例方法,实例方法必须通过对象调用 *设置方法为静态方法
*@return 一个上面的static 对象 */
public static lazySingleton getInstance() {
//添加逻辑如果实例化过,直接返回
if(ourInstance==null){
/*
* 多线程访问下,可能出现if 同时成立的情况,添加锁;
监控这个类下创建一个锁,每次只允许一个class进入;
*/
synchronized (lazySingleton.class){
if(ourInstance==null){ //双重验证
ourInstance =new lazySingleton();
}
}
}
return ourInstance;
} }
3.4 测试
lazySingleton singleton = lazySingleton.getInstance();
lazySingleton singleton1 = lazySingleton.getInstance();
System.out.println(singleton==singleton1);
System.out.println(singleton);
System.out.println(singleton1); --------------------
true
com.test.lazySingleton@60e53b93
com.test.lazySingleton@60e53b93
4.饿汉式 (IDEA 编译器默认的singleTon)
解决了懒汉式中多线程访问可能出现同一个对象和效率低问题 ,多个实例共用一个对象!
public class hungerSingleton {
private static hungerSingleton ourInstance = new hungerSingleton(); public static hungerSingleton getInstance() {
return ourInstance;
} private hungerSingleton() {
}
}