1.作用: 在应用程序有保证最多只能有一个实例.
2.好处:
2.1 提升运行效率.
2.2 实现数据共享.
案例:application 对象
3. 懒汉式
3.1 对象只有被调用时才去创建,由于添加了锁 所以效率低
3.2 示例代码
package 单例设计;
public class SingleTon {
/**
* 无返回值 方法名和类名相同
*其他类不能实例化这个接口
*
* 对外提供访问入口
*/
/**
*
* 由于对象需要被静态方法调用 把方法设置为static
* 由于对象是static 必须设置访问权限修饰符 为private
* 如果是public 可以直接调用对象了 不执行访问入口;1
*/
private static SingleTon singleTon;
private SingleTon(){
}
/**
* 实例方法是通过对象调用
* 设置方法为静态方法
*
* 多线程访问下,可能出现if同时出现的情况 要添加锁
* @return
*/
public static SingleTon getInstance(){
if (singleTon==null)
synchronized (SingleTon.class) {
if (singleTon==null)
//双重验证 防止前面的线程new了,后面那段new
singleTon = new SingleTon();
}
return singleTon;
}
}
Test
package 单例设计;
public class Test {
public static void main(String[] args) {
SingleTon singleTon = SingleTon.getInstance();
SingleTon singleTon1 = SingleTon.getInstance();
System.out.println(singleTon);
System.out.println(singleTon1);
}
}
4. 饿汉式
4.1 解决了懒汉式中多线程访问可能出现同一个对象和效率低问
题
4.2在类加载时候就去创建了一个对象
4.3代码
package 单例设计;
public class HungryMan {
//在类加载时就实例化
private static HungryMan hungryMan=new HungryMan();
private HungryMan(){}
public static HungryMan getInstance(){
return hungryMan;
}
}
Test
@org.junit.Test
public void demoHungry(){
HungryMan hungryMan =HungryMan.getInstance();
HungryMan hungryMan1=HungryMan.getInstance();
System.out.println(hungryMan);
System.out.println(hungryMan1);
}