`
s343174147
  • 浏览: 33390 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

单例设计模式---饿汉式 和懒汉式

 
阅读更多
首先写个单例:
//懒汉式
public class SingleDemo {
private static SingleDemo s = null;
private SingleDemo(){}
public static  SingleDemo getInstance(){
if(s == null){
s = new SingleDemo();
}
return s;
}
}
//饿汉式
public class singleDemo{
private static SingleDemo s = new SingleDemo ();

private SingleDemo (){
}
public static  SingleDemo getInstance(){
return s;
}
}

写个测试类:

public class ThreadDemo3 {

public static void main(String[] args) {
SingleDemo s1 = SingleDemo.getInstance();
SingleDemo s2 = SingleDemo.getInstance();
System.out.println(s2 == s2);
}
}


运行结果一直都是true,说明单线程下是没问题的,下面写个多线程来访问单例

public class ThreadTest implements Runnable {
//存放单例对象,使用Set是为了不存放重复元素
public Set<SingleDemo> singles = new HashSet<SingleDemo>();
@Override
public void run() {
//获取单例
SingleDemo s = SingleDemo.getInstance();
//添加单例
singles.add(s);
}
}


使用多线程并发访问单例:

public class ThreadDemo3 {

public static void main(String[] args) {
// SingleDemo s1 = SingleDemo.getInstance();
// SingleDemo s2 = SingleDemo.getInstance();
// System.out.println(s2 == s2);
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
System.out.println(t.singles);
}
}

运行结果如下:

[com.persagy.thread.SingleDemo@1bc4459, com.persagy.thread.SingleDemo@150bd4d]



[com.persagy.thread.SingleDemo@12b6651]

说明有线程并发访问安全问题,获取的不一定都是同一个实例

如何解决线程安全问题呢?

当然使用同步锁机制了啊

下面改进单例:

public class SingleDemo {
private static SingleDemo s = null;
private SingleDemo(){}
public static synchronized SingleDemo getInstance(){
if(s == null){
s = new SingleDemo();
}
return s;
}
}

加入同步函数后线程安全问题解决了

运行多次都是获取同一个实例,不会出现2个实例的情况了

[com.persagy.thread.SingleDemo@12b6651]

但是在多线程并发访问的情况下,每个线程每次获取实例都要判断下锁,效率比较低,为了提高效率,我加入了双重判断的方法,解决了效率的问题

代码如下;

public class SingleDemo {
private static SingleDemo s = null;
private SingleDemo(){}
public static  SingleDemo getInstance(){
/*如果第一个线程获取到了单例的实例对象,
* 后面的线程再获取实例的时候不需要进入同步代码块中了*/
if(s == null){
//同步代码块用的锁是单例的字节码文件对象,且只能用这个锁
synchronized(SingleDemo.class){
if(s == null){
s = new SingleDemo();
}
}
}
return s;
}
}


用这种方式解决了懒汉式的线程安全问题,也提高了效率,但是在实际开发中还是用饿汉式的比较多,毕竟这个代码比较多,比较繁琐。
了解跟多可以参考下面的连接http://www.iteye.com/topic/537563
分享到:
评论

相关推荐

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

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

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

    这种模式在Java中有两种常见的实现方式:饿汉式和懒汉式。 1. 饿汉式单例: 饿汉式单例在类加载时就完成了初始化,因此类加载时就创建了单例对象。这种方式称为预先加载方式,它保证了线程安全,因为对象的创建在类...

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

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

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

    Java中的单例设计模式是一种常用的设计模式,它确保一个类只有一个实例,并且提供一个全局访问点。单例模式常用于管理资源,如配置信息的读取,或者在系统中需要一个全局协调者的情况下。 单例设计模式有两大关键点...

    java单例设计模式-饿汉式-懒汉式[归纳].pdf

    总结,Java单例设计模式通过饿汉式和懒汉式实现,饿汉式在类加载时创建实例,适用于不需要延迟加载的情况;懒汉式在首次调用时创建,但在多线程环境下需要额外的同步措施以保证线程安全。在实际应用中,应根据具体...

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

    饿汉式单例设计模式 饿汉式在类加载时即创建单例对象,因此在类加载阶段就已经完成了初始化。由于类加载是线程安全的,所以饿汉式天生就是线程安全的。它的实现代码如下: ```java public class Singleton { ...

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

    单例设计模式是一种常用的设计模式,它主要用于控制类的实例化过程,确保在整个应用程序中,一个类只有一个实例存在。这种模式常被用于那些需要频繁创建和销毁,且资源消耗较大的对象,例如数据库连接、线程池或者...

    单例模式----数据库连接池管理类的应用

    在具体实现中,单例模式通常有懒汉式和饿汉式两种方式。懒汉式是在第一次使用时才创建实例,保证了线程安全但可能有性能损失;饿汉式是在类加载时就创建实例,效率高但不支持延迟加载。还有一种双重检查锁定(DCL)...

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

    在这个场景中,我们将探讨如何使用单例模式来创建一个学生管理系统,主要涉及“饿汉式”和“懒汉式”两种实现方式。 **饿汉式单例** 饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。这种方式保证了单例...

    单例模式-----<ant求职记之设计模式>

    单例模式是软件设计模式中的一种经典模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java或C#等面向对象的语言中,单例模式广泛用于控制资源的共享,比如数据库连接、线程池或者配置文件的读取等。这种...

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

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

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

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

    C++单例模式懒汉式和饿汉式

    在C++中,单例模式的实现通常有两种常见的方式:懒汉式(Lazy Initialization)和饿汉式(Eager Initialization)。 1. 懒汉式单例模式: 懒汉式单例的特点是在第一次使用时才创建实例,即延迟初始化。这种设计的...

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

    单例模式有两种常见的实现方式:懒汉式和饿汉式。 ### 懒汉式单例 懒汉式单例,顾名思义,是一种延迟初始化的单例模式,即在第一次调用时才创建实例。这种方式的优点是在需要的时候才创建对象,节省了内存资源;...

    设计模式——单例模式

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

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

    这种方法在Java中通常被称为饿汉式或懒汉式实现。 ### 实例:皇帝类 ```java package com.cbf4life.singleton1; public class Emperor { private static Emperor emperor = null; private Emperor() { // ...

    设计模式-单例设计模式

    ### 设计模式—单例设计模式详解 #### 定义 单例模式是一种常见的创建型设计模式,其核心思想在于确保一个类仅有一个实例存在,并且该实例由该类自行创建,随后向整个系统提供这一唯一实例。 #### 类图解析 在设计...

    单例模式分享-吴昌良

    1. **懒汉式与饿汉式单例**:这两种模式分别在类加载时初始化实例和在首次请求实例时初始化实例。 2. **线程安全问题**:在多线程环境中如何确保单例模式的线程安全。 3. **单例模式的优缺点**:讨论单例模式的优点...

    单例模式案例-打印机案例.zip

    在C++中,单例模式的实现有多种方式,包括懒汉式、饿汉式、双重检查锁定(DCL)等。懒汉式是在第一次使用时才创建对象,而饿汉式则是在程序启动时就立即创建。DCL则是为了结合两者的优点,既延迟初始化,又保证线程...

    java单例设计模式的好处

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

Global site tag (gtag.js) - Google Analytics