`
heipark
  • 浏览: 2095375 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程Singleton模式笔记

    博客分类:
  • Java
 
阅读更多

单线程下安全使用的Singleton示例

 

public class Singleton {

	private static Singleton instance = null;

	private Singleton() {
		System.out.println("create instance.");
	}

	public static Singleton getInstance() {

		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}

	public static void main(String[] agrs) {
		new Singleton();
	}
}

 

单线程代码放到多线程下,将会出现线程不安全情况

 

 

class SingletonTestRunnable implements Runnable {
	public void run() {
		Singleton.getInstance();
	}
}

public class Singleton {

	private static Singleton instance = null;

	private Singleton() {
		System.out.println("create instance.");
	}

	public static Singleton getInstance() {

		if (instance == null) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			instance = new Singleton();
		}
		System.out.println("instance hashCode : " + instance.hashCode());
		return instance;
	}

	public static void main(String[] agrs) {
		new Thread(new SingletonTestRunnable()).start();
		new Thread(new SingletonTestRunnable()).start();
	}
}
 

多线程Singleton反模式——使用synchronized修饰方法

 

	public static synchronized Singleton getInstance() {
            ....
        }

   添加synchronized关键字确实可以解决多线程安全问题,但是仍然认为是反模式。原因是执行效率低,getInstance()方法只允许一个线程进入,阻塞会增加程序运行时间。

 

★多线程Singleton最佳实践——eager模式

 

class SingletonTestRunnable implements Runnable {
	public void run() {
		Singleton.getInstance();
	}
}

public class Singleton {

	private static Singleton instance = new Singleton(); 

	private Singleton() {
		System.out.println("create instance.");
	}

	public static Singleton getInstance() {
		return instance;
	}

	public static void main(String[] agrs) {
		new Thread(new SingletonTestRunnable()).start();
		new Thread(new SingletonTestRunnable()).start();
	}
}

 

★多线程Singleton最佳实践——lazy模式

 

class SingletonTestRunnable implements Runnable {
	public void run() {
		Singleton.getInstance();
	}
}

public class Singleton {

	private Singleton() {
		System.out.println("create instance.");
	}

	public static Singleton getInstance() {
		return Container.instance;
	}
	
	private static class Container {
		private static Singleton instance = new Singleton();
	}

	public static void main(String[] agrs) {
		new Thread(new SingletonTestRunnable()).start();
		new Thread(new SingletonTestRunnable()).start();
	}
}

 

--heipark

 

 

 

分享到:
评论

相关推荐

    设计模式学习笔记大全

    在多线程环境中,正确实现单例模式需要考虑线程安全,防止多个线程同时创建实例。通常使用双重检查锁定(Double-Checked Locking)或静态内部类等方式实现。 2. 工厂方法模式(Factory Method): Factory Method...

    Java中线程同步和线程协作学习笔记

    单例模式通过私有构造器和静态工厂方法来实现,同时使用`synchronized`关键字保证在多线程环境下的安全性。例如: ```java public class Singleton { private static Singleton instance; private Singleton() {...

    台湾人写的设计模式笔记

    4. **多执行线程模式(Multithreading Patterns)** 在Java中,多执行线程是并发编程的关键。这些模式包括线程池(Thread Pool)、守护线程(Daemon Thread)、锁(Locking Strategies)等。线程池可以有效地管理线程资源,...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段38讲、多线程Active Objects设计模式(接受异步消息的主动对象)-上.mp4 │ 高并发编程第二阶段39讲、多线程Active Objects设计模式(接受异步消息的主动对象)-中.mp4 │ 高并发编程第二阶段40...

    设计模式笔记

    多线程模式关注于在多线程环境下如何安全、高效地管理和协调多个线程。这类模式包括: - **Guarded Suspension(受保护的暂停模式)**:当一个线程调用另一个线程的同步方法时,如果该同步方法没有准备好,则该线程...

    单例模式学习笔记

    在多线程环境下,通过同步整个`getInstance()`方法来保证线程安全,但效率较低。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized static ...

    C#设计模式学习笔记

    行为型模式则关乎对象间交互,例如策略模式(Strategy)允许在运行时选择算法,观察者模式(Observer)用于定义对象间的依赖关系,以及责任链模式(Chain of Responsibility)让多个对象有机会处理请求。 C#设计...

    17-Java单例模式的学习笔记1

    上述代码在多线程环境下可能会创建多个实例,因此需要改进。 2. **饿汉式**: 饿汉式单例在类加载时即完成初始化,保证了线程安全,但牺牲了延迟初始化的优点。例如: ```java public class Singleton { ...

    设计模式学习笔记

    实现单例模式时要注意线程安全问题,通常使用双检锁等技术来保证多线程环境下的正确性。 #### 七、适配器模式 (Adapter) **类图与描述:** 适配器模式允许不兼容的接口能够一起工作,通常用于让现有类能够与期望...

    单例设计模式--浅浅笔记

    但是,如果不加同步控制,多线程环境下可能产生多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance...

    《设计模式》学习笔记

    单例模式在多线程环境中尤其重要,因为它确保了对象的唯一性和资源的有效利用。 #### 结构型模式详解 - **适配器模式**:允许不兼容的接口之间能够协作。有两种形式:类适配器和对象适配器。类适配器通过多重继承...

    剑指Offer(第二版)笔记.docx

    这种方法被称为"懒汉式",在多线程环境下存在风险。因为当多个线程同时进入`if (instance == null)`条件时,可能会创建多个实例。代码如下: ```java public class Singleton1 { private Singleton1() {} ...

    【课堂笔记】单例模式详解

    此外,在实际应用中,还要考虑序列化、多线程环境、测试等因素对单例模式的影响。 在设计系统时,合理运用单例模式可以提高代码的可读性和可维护性。但是,过度使用单例也可能导致设计过于复杂,使得系统难以测试和...

    Java工作笔记(必看经典).pdf

    Java支持多线程编程,允许开发者创建多个线程并发执行任务。Java中有两种类型的线程:用户线程和守护线程。用户线程是开发者创建的线程,守护线程是JVM创建的线程。 六、Java网络编程 Java提供了多种网络编程的API...

    设计模式学习笔记 .txt

    - 需要注意线程安全问题,在多线程环境中可能会出现问题。 - **应用场景**: - 当希望在整个系统中,某个类只能出现一个实例时。 - 当对象创建的过程非常耗时或者耗资源时。 #### Factory Method(工厂方法)...

    良葛格DesignPattern学习笔记

    良葛格的《Design Pattern学习笔记》不仅涵盖了经典的GOF设计模式,还额外介绍了几种多线程模式,这使得这份学习笔记成为了一个宝贵的学习资源。下面将对其中的部分设计模式进行详细介绍。 #### 二、GOF设计模式 ...

    我自己的个人的编程笔记

    由于描述中提到“主要包括了自己编程平时的收集随笔”,可以推测这份笔记覆盖了多个编程领域和技术细节。 ### 2. Java线程组(ThreadGroup)的使用 #### 2.1 ThreadGroup简介 - **定义**:`ThreadGroup`是Java中用于...

    java学习笔记

    ### Java学习笔记——设计模式与基础概念解析 #### 一、设计模式概述 设计模式是在软件开发过程中,针对常见的问题提出的经过验证的解决方案。这些模式是开发者们在长期实践中不断提炼和完善的结果,能够帮助...

    java笔记.docx

    【Singleton 单例模式】 单例模式是一种设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以节省系统资源,避免对系统内存的过度消耗。在Java...

Global site tag (gtag.js) - Google Analytics