Java设计模式之单例模式

简介: 一、懒汉模式 package com.pengli.designmode.singleton; public class Singleton1 { // 私有静态变量 // 需要 用volatile修饰 private static volatile Singleton1 singl...
+关注继续查看

一、懒汉模式

package com.pengli.designmode.singleton;

public class Singleton1 {

	// 私有静态变量
	// 需要 用volatile修饰
	private static volatile Singleton1 singleton = null;

	// 私有构造函数,不能实例化
	private Singleton1() {
	}

	// 静态工厂方法
	public static synchronized Singleton1 getInstance() {
		if (singleton == null) {
			synchronized (Singleton1.class) {
				if (singleton == null) {
					singleton = new Singleton1();
				}
			}
		}
		return singleton;
	}
}

1、double-check可实现并非每次都使用synchronized进行锁定,提高性能;
2、synchronized能够实现第一次实例化时的线程安全;
3、为什么还要使用volatile呢?
      答案:不加的情况下,假设两个线程,线程A正在执行instance = new Instance()的操作,而线程B开始执行if(instance==null)的判断,当不存在volatile的时候,因为 new Instance()是一个非原子操作,可能发生无序写入,构造函数可能在整个对象构造完成前执行完毕,线程B可能会看到一个不完整的instance对象,因为java的某些实现会在内存中开辟一片存储对象的区域后直接返回内存的引用,所以线程B判断不为null,而这时候实际上,instance的构造函数还没有执行,从而线程b得到不完整的对象。

在 Instance 的构造函数执行之前,会在内存中开辟一片存储对象的区域后直接返回内存的引用,赋值给变量 instance,instance也就可能成为非 null 的,即赋值语句在对象实例化之前调用,此时别的线程得到的是一个还会初始化的对象,这样会导致系统崩溃线程B可能会看到一个不完整的instance对象,因为java的某些实现,所以线程B判断不为null。从而得到不完整的对象。

package com.pengli.designmode.singleton;

public class Singleton2 {

	private static class LazyHolder {
		private static final Singleton2 INSTANCE = new Singleton2();
	}

	private Singleton2() {
	}

	public static final Singleton2 getInstance() {
		return LazyHolder.INSTANCE;
	}
}


二、饿汉模式

package com.pengli.designmode.singleton;

//饿汉式单例类.在类初始化时,已经自行实例化   
public class Singleton3 {  
  private Singleton3() {}  
  private static final Singleton3 single = new Singleton3();  
  //静态工厂方法   
  public static Singleton3 getInstance() {  
      return single;  
  }  
}  


参考:

http://blog.csdn.net/jason0539/article/details/23297037/

http://www.iteye.com/topic/652440


相关文章
|
2月前
|
设计模式 存储 安全
Java设计模式:深入探讨饿汉式单例模式
当谈到Java设计模式时,"单例模式"是一个必不可少的主题。在这篇文章中,我们将深入探讨单例模式的一种常见实现方式——"饿汉式"。我们将了解什么是饿汉式单例模式,为什么选择它,以及如何在Java中实现。
31 0
|
3月前
|
设计模式 Java Windows
Java设计模式 —— 单例模式
Java设计模式 —— 单例模式
|
3月前
|
设计模式 安全 Java
了解Java设计模式中的单例模式:实现与最佳实践
了解Java设计模式中的单例模式:实现与最佳实践
|
3月前
|
设计模式 SpringCloudAlibaba 安全
Java设计模式(二):单例模式
**单例设计模式**(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式
62 0
|
4月前
|
设计模式 安全 Java
【Java】设计模式之单例模式与工厂模式
【Java】设计模式之单例模式与工厂模式
84 0
|
4月前
|
设计模式 安全 Java
Java设计模式_单例模式
Java设计模式_单例模式
|
5月前
|
设计模式 安全 Java
Java设计模式—单例模式
Java设计模式—单例模式
45 0
|
6月前
|
设计模式 Java
18 java设计模式---单例模式
1 什么是单例模式 单例(单个实例)模式:采用一定方法,保证在整个系统中对某个类只能存在一个实例对象,并且本类只提供一个提取对象的方法
43 0
|
8月前
|
设计模式 Java 数据库连接
Java设计模式之单例模式
当你需要一个类只能创建一个对象的时候,例如数据库连接时,服务端只需要一个连接对象便能处理很多查询工作,如果此时一个连接一个查询势必会造成内存的浪费,造成服务器的卡顿,所以此时就出现了一个需求,怎样让一个类只创建一个对象呢
83 0
|
9月前
|
设计模式 Java
Java常用设计模式-单例模式
Java常用设计模式-单例模式
相关产品
云迁移中心
推荐文章
更多