`

JAVA单例设计模式Single--饿汉式-懒汉式-多线程中的设计

    博客分类:
  • JAVA
阅读更多
/**
 * 单例设计模式--懒汉式--饿汉式
 * 
 * 懒汉式--适用于实例的延迟加载--如果多线程访问,容易出现安全问题--可以通过加同步锁解决
 * 加锁的效率问题需要考究
 * 
 * 延迟加载的单例设计模式--懒汉式
 */ 
 //饿汉式
 class Single1
 {
 	private static final Single1 s = new Single1();
 	private Single1(){}
 	public static Single1 getInstance(){
 		return s;
 	}
 }
 //懒汉式--有问题的
 /**
  * 在多线程访问过程中会产生安全隐患
  */
// class Single2{
// 	private static Single2 s = null;
// 	private Single2(){}
// 	
// 	public static Single2 getInstance(){
// 		if(s==null){
// 			//线程进入A--阻塞
// 			//线程进入B--阻塞
// 			//A唤醒--new一次
// 			//B唤醒--new一次
// 			//==>单例失效
// 			s = new Single2();
// 		}
// 		return s;
// 	}
// }
 //安全解决方案
// class Single2{
//	 	private static Single2 s = null;
//	 	private Single2(){}
//	 	
//	 	//问题--多线程,每个线程都想获取实例例都要判断一次锁--懒汉式加锁会影响程序效率
//	 	//B不能进入--
//	 	public static synchronized Single2 getInstance(){
//	 		if(s==null){
//	 			//A线程进入--阻塞--有同步锁
//	 			s = new Single2();
//	 		}
//	 		return s;
//	 	}
//}
 //懒汉式--升级
 class Single2{
 	private static Single2 s = null;
 	private Single2(){}
 	/**
 	 * 通过双重判断以提高懒汉式的效率
 	 */
 	public static Single2 getInstance(){
 		if(s==null){
 			//2.B线程进入--被锁挡住,停止
 			synchronized(Single2.class)
 			{
 				//4.B进入不满足--null return s
		 		if(s==null){
		 			//1.A线程进入--阻塞
		 			//3.A唤醒--执行完毕
		 			s = new Single2();
		 		}	
	 		}
 		}
 		return s;
 	}
 }
分享到:
评论

相关推荐

    java 单例模式(懒汉式与饿汉式).docx

    单例设计模式又分为两种方式,懒汉式和饿汉式。 懒汉式单例是一种延迟加载的单例模式,它只有当调用 getInstance 的时候,才会初始化这个单例。这种模式的优点是可以减少资源的加载和性能上的负担,但是它需要使用 ...

    java 单例模式(懒汉式与饿汉式)

    单例设计模式又分为两种方式,懒汉式和饿汉式。 懒汉式单例 懒汉式单例模式是指只有当调用getInstance的时候,才会初始化这个单例。这种方法可以保证线程安全,又减轻了资源加载和性能上的负担。下面是一个懒汉式...

    Java多线程-解决单例模式中的懒汉式的线程安全问题

    ### Java多线程—解决单例模式中的懒汉式的线程安全问题 #### 一、单例设计模式的线程安全问题 ##### (1)饿汉式没有线程安全问题 **饿汉式**是一种非常典型的单例模式实现方式,其特点是在类加载时就完成了实例...

    Java 单例模式.pptx

    单例模式是一种常用的软件设计模式,在这种模式中,一个类只能拥有一个实例,并且该类必须自行创建并提供这个实例。通常,单例模式用于确保某个类在整个应用程序生命周期中只存在一个实例,这有助于节省资源并简化对...

    单例模式(懒汉式,饿汉式)

    单例模式是设计模式中的一种常见模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,这种模式常用于控制资源的消耗,比如数据库连接、线程池等,避免频繁创建和销毁对象带来的性能开销...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    Java-single-instance.rar_java single_single_single-pass

    Java单例模式是一种常见的设计模式,它在软件工程中被广泛使用,以确保一个类只有一个实例,并提供一个全局访问点。这种模式对于那些资源管理、配置对象或日志记录等需要全局唯一的对象非常有用。在Java中实现单例...

    Java设计模式之单例模式的七种写法

    在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...

    java 单例模式(饿汉模式与懒汉模式)

    在懒汉式单例模式中,我们需要使用同步关键字synchronized来避免多线程环境下的安全隐患。否则,懒汉式单例模式就谈不上单例了。 单例模式的应用 单例模式常用于JDBC链接数据库,例如,一个应用程序可能需要多个...

    java之单例模式

    单例模式是设计模式中较为常见的一种,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在实际开发中有着广泛的应用场景,比如系统配置管理、日志对象、线程池、数据库连接等。 #### 二、单例模式的特点 ...

    Java-single-model.rar_single

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时简化对共享资源...

    JAVA单例模式

    单例模式是设计模式中最简单的一种模式,其目的是确保某一个类只有一个实例存在,并且该类能够自行创建这个实例。这种模式通常用于那些需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的情况下,比如...

    单例模式详解

    在多线程环境下,懒汉式单例需要加锁以保证线程安全。否则,可能会导致单例失败。 ```java public class Singleton { // 私有的默认构造子 private Singleton() {} // 已经自行实例化 private static Singleton...

    Android单例模式

    单例模式是软件工程中常用的设计模式之一,尤其在Java编程中非常普遍。它的核心在于确保某类在整个应用程序生命周期中仅存在一个实例,并且该类能全局访问该实例。 **特点如下:** 1. **唯一性**:单例类只能有一...

    java小班讨论——Factory_single

    在Java编程语言中,"Factory_single"这个主题很可能是指工厂模式和单例设计模式的讨论。这两种模式都是软件设计模式中的重要概念,广泛应用于创建对象的场景。 首先,让我们深入理解工厂模式。工厂模式是一种创建型...

    java 中设计模式之单例

    但是,如果在多线程环境中,不加同步控制的懒汉式会导致多个线程同时创建单例,所以通常会使用`synchronized`关键字来保证线程安全。以下是懒汉式的Java实现: ```java public class Single2 { private static ...

    (两种)单子模式 (饿汉,懒汉)

    在Java中,单子模式的实现通常有两种方式:饿汉式和懒汉式。 1. **饿汉式**: 饿汉式单例在类加载时即完成了实例化,因此它是线程安全的。在上面的`EagerSingletion`类中,`single`实例在类加载时被初始化,这意味...

    浅谈JAVASE单例设计模式

    单例设计模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用广泛,尤其是在处理系统级服务、配置信息、线程池等需要全局共享的对象时。下面我们将...

    Java之单例模式&&NIO

    Java中的单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供一个全局访问点。在给定的代码示例中,我们看到了两种常见的单例实现方式:懒汉式和饿汉式。 **懒汉式单例模式**: 懒汉式单例的特点是延迟...

Global site tag (gtag.js) - Google Analytics