`
大鹏展翅XS
  • 浏览: 2880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

正宗的懒汉式单例设计模式

阅读更多
一、懒汉式单例设计模式1:
class Singleton {
private static Singleton instance;  

private Singleton() {
System.out.println("*********构造*************");
}

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

public void print() {
System.out.println(Thread.currentThread().getName() + " = Test Singleton!");
}
}

public class TestSingle {
public static void main(String[] args) {
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
}
}
此时运行程序之后的输出结果如下:
*********构造*************
*********构造*************
Thread-1 = Test Singleton!
*********构造*************
*********构造*************
Thread-5 = Test Singleton!
*********构造*************
Thread-3 = Test Singleton!
Thread-2 = Test Singleton!
Thread-4 = Test Singleton!
Thread-0 = Test Singleton!
Thread-6 = Test Singleton!
分析发现;该类中并不是只实例化了一个对象,这与单例设计模式的概念相违背。查阅相关资料发现:当类的属性没有用volatitle关键字修饰时,在多线程运行的环境中,每个线程操作的都是该属性的一个副本,当某个线程更改了该属性的值之后,到该属性的值同步改变之后是需要时间的(即是有延迟的),所以出现了该单例类实例化了好几个对象的情况。线程操作副本的示例图如下:


当用volatile修饰属性之后,则这个属性一旦设置后,将自动立刻进行原始变量的同步,不会出现任何的延时

二、修改后正宗的懒汉式单例设计模式如下:
class Singleton {
private volatile static Singleton instance;   //volatile修饰该属性后,表示这个属性一旦设置后,将自动立刻进行原始变量的同步

private Singleton() {                     //既然是单例,构造方法就要私有化
System.out.println("**********构造***************");
}

public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {   //只是此部分操作进行了同步
if (instance == null) {       //每个线程进来之后要判断一下instance是不是为null
instance = new Singleton();
}
}
}
return instance;
}

public void print() {
System.out.println(Thread.currentThread().getName());
}
}

public class TestSingle {
public static void main(String[] args) {
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
}
}
运行程序后输出结果如下:
**********构造***************
Thread-0
Thread-1
Thread-3
Thread-2
Thread-4
Thread-5
Thread-6
至此正宗的懒汉式单例设计模式就写出来了
三、饱汉式单例设计模式
class Singleton {
private static Singleton instance = new Singleton();   //直接将该对象实例化好

private Singleton() {}

public static Singleton getInstance() {
return instance;
}

public void print() {
System.out.println(Thread.currentThread().getName());
}
}

public class TestSingleton {
public static void main(String[] args) {
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
new Thread(() -> {
Singleton.getInstance().print();
}).start();
}
}
开发中单例的概念应用比较多
  • 大小: 85.9 KB
分享到:
评论

相关推荐

    设计模式——单例模式

    实现单例模式主要有两种方式:饿汉式和懒汉式。 ### **饿汉式单例模式** 饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用...

    Java中懒汉单例设计模式线程安全测试

    Java中懒汉单例设计模式线程安全测试,单例设计模式的测试

    java单例设计模式-饿汉式-懒汉式 (2).docx

    单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点。这种模式在Java中有两种常见的实现方式:饿汉式和懒汉式。 1. 饿汉式单例: 饿汉式单例在类加载时就完成了初始化...

    2种单例模式:1赖汉式:2饿汉式

    在Java编程语言中,单例模式是一种常用的软件设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。单例模式的应用广泛,比如在管理系统资源、配置信息、日志记录等方面。这里我们将详细探讨标题...

    C++实现单例模式(懒汉式)源码

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在C++中,实现单例模式有多种方式,这里我们将聚焦于懒汉式(Lazy Initialization)的实现。懒汉式单例的特点...

    java单例设计模式的好处

    单例设计模式是软件开发中一种重要的设计模式,它的核心思想是确保一个类只有一个实例,并提供全局访问点。在Java中,单例模式通常用于控制特定类的实例化过程,以达到节省系统资源、控制并发访问和实现数据共享等...

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

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

    单例设计模式的优缺点和设计思想

    单例设计模式是一种在软件工程中广泛使用的创建型设计模式,其核心思想是确保一个类仅有一个实例,并提供一个全局访问点。这种模式在多种场景下具有显著的优势,同时也存在一定的局限性和潜在的问题。 ### 单例设计...

    单例设计模式源码和案例解析

    单例设计模式是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在Java编程中,单例模式的应用广泛,例如控制资源的共享、管理配置信息等。本篇将深入解析单例设计模式的四种实现方式,并通过...

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

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

    使用单例模式创建学生管理系统(饿汉式、懒汉式)

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java或类似的面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。在这个...

    java单例设计模式-饿汉式-懒汉式.pdf

    Java 单例设计模式主要分为两种实现方式:饿汉式和懒汉式。这两种方式都是为了确保一个类只有一个实例,并且提供全局访问点。 **饿汉式**: 饿汉式单例在类加载时就完成了实例化,因此是静态常量的方式,确保了线程...

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

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

    单例设计模式_单例设计模式_

    单例设计模式是一种在软件工程中广泛使用的设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象需要跨模块共享时特别有用,例如数据库连接、...

    java单例设计模式-饿汉式-懒汉式 (2).pdf

    懒汉式单例设计模式 懒汉式在首次调用`getInstance()`方法时才创建单例对象,实现了延迟加载。但是,非线程安全的懒汉式在多线程环境下可能会创建多个实例。示例代码如下: ```java public class Singleton { ...

    Java的单例设计模式

    单例设计模式是软件设计模式中的经典模式之一,它的核心思想是确保一个类只有一个实例,并提供全局访问点。这种模式在Java中广泛应用于系统配置、线程池、缓存管理等场景,因为这些场景通常只需要一个共享的全局对象...

    设计模式——单例模式(懒汉模式)

    总的来说,单例模式是一种常见的设计模式,懒汉式单例模式则是其中一种实现策略,它的主要特点是延迟加载和线程安全。在选择单例模式实现时,开发者需要根据具体需求考虑性能、线程安全以及代码简洁性等因素。

    单例设计模式.pdf

    单例设计模式是一种在软件设计中广泛使用的设计模式,它属于创建型模式,其核心目标是确保类只有一个实例,并提供一个全局访问点。这个模式在Java中尤其常见,因为Java的垃圾回收机制允许对象长时间驻留在内存中,...

    java单例设计模式-饿汉式-懒汉式[参照].pdf

    单例设计模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在Java中,单例模式有两种常见的实现方式:饿汉式和懒汉式。 1. **饿汉式**: 饿汉式单例在类加载时即创建了...

    java单例设计模式-饿汉式-懒汉式.docx

    在Java中,单例模式通常有两种实现方式:饿汉式和懒汉式。 1. 饿汉式: 饿汉式是在类加载时就完成了初始化,因此它是线程安全的。代码如下: ```java public class Singleton { private static final Singleton ...

Global site tag (gtag.js) - Google Analytics