java

单例设计模式1

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、
以及解决问题的思考方式。

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对
某个类只能存在一个对象实例并且该类只提供一个取得其对象实例的方法

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构
造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生
类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无
法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,
静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象
的变量也必须定义成静态的。

今天我们来看下单例设计模式中的饿汉式和懒汉式。

一. 饿汉式

优点: 线程安全,写法最简单,在类加载的时候就实例化了,避免线程同步的问题。

缺点: 类加载就完成了实例化,如果永远都用不上这个类的话,那就资源浪费了。

步骤如下:

  • 私有化类的构造器;(private)
  • 类内部创建对象,此对象私有且静态;(private,static)
  • 提供公共的静态的方法,返回类的对象  .(public,static)
public class hungry {
	public static void main(String[] args) {
		Order order1 = Order.getOrder();
		Order order2 = Order.getOrder();
		System.out.println(order1 == order2);//true,证明是同一对象
	}
	
}

class Order{
	private Order(){
		
	}
	
	private static Order order = new Order();
	
	public static Order getOrder(){
		return order;
	}
}

二.懒汉式

优点: 延迟对象的创建.

缺点: 多线程时不安全,后续会修改。

步骤如下:

  • 私有化类的构造器;
  • 声明静态私有的类对象(不是创建);
  • 声明public、static的返回当前类对象的方法。在此方法里判断如果类对象没被创建,那么就创建。并返回类的对象。

由此可以看出为什么线程不安全了,当多线程时,就会出现实例化多次的情况,如下:

线程1:进入了 if 语句,准备进行实例化。此时线程2进来了,线程1被挂起。

线程2:进入 if 语句,创建完实例后,切换回线程1 继续执行。

线程1:继续实例化类对象。

可以看出会创建两个不同的类对象, 就不符合单例模式了。

线程不安全写法:
public class Lazy {
	public static void main(String[] args) {
		Order_One orde1 = Order_One.getLazy();
		Order_One orde2 = Order_One.getLazy();
		
		System.out.println(orde1 == orde2);
	}
	
	
}

class Order_One{
	private Order_One(){}
	private static Order_One order_One;
	
	public static Order_One getLazy() {
		if (order_One == null){
			order_One = new Order_One();
		}
		return order_One;
	}
}
线程安全写法:(效率比较低)
public class Lazy {
	public static void main(String[] args) {
		Order_One orde1 = Order_One.getLazy();
		Order_One orde2 = Order_One.getLazy();
		
		System.out.println(orde1 == orde2);
	}
	
	
}

class Order_One{
	private Order_One(){}
	private static Order_One order_One;
	
	public synchronized static Order_One getLazy() {
		if (order_One == null){
			order_One = new Order_One();
		}
		return order_One;
	}
}

见名知意:懒汉式就是什么时候用什么时候创建类的对象,所以不会资源浪费。饿汉式呢就是一开始就创建好了类的对象,如果此类长时间用不上,就会浪费资源。

三.java中的单例设计模式

java.lang.Runtime:(饿汉式)

单例设计模式1已关闭评论