`

Java_Singleton和多线程

    博客分类:
  • Java
 
阅读更多

via: http://blog.csdn.net/natee/article/details/4408245

 

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

 

第一种形式

public class Singleton {  

    // Early initialization.定义的时候就初始化(不推荐)。  

    private static Singleton s = new Singleton();  

    private Singleton() {  

    }  

    public static Singleton getInstance() {  

        return s;  

    }  

}

 

第二种形式

public class Singleton {  

    private static Singleton s;  

    private Singleton() {  

    }  

    // Lazy initialization. 延迟初始化,使用的时候再初始化,效率较高(推荐)。  

    public static Singleton getInstance() {  

        if (s == null) {  

            s = new Singleton();  

        }  

        return s;  

    }  

}

 

实现的关键:

1. 将所有的构造函数都设为private ,而且必须显示的指定构造函数(不能设置为默认的,因为默认构造函数是package访问权限)。

2. 注意clone()方法。

    例如, 如果基类实现了cloneable接口的话,子类就应该重写该方法。当然,在应用中应该灵活运用各种方法来防止clone()的各种情况。

@Override  

protected Object clone() throws CloneNotSupportedException {  

    throw new CloneNotSupportedException();  

}

 

 

多线程调用singleton方法:

 

如果在网络编程中,要注意多线程访问singleton引发的一系列问题:

public class Singleton {  

    private static Singleton s;  

    private Singleton() {  

    }  

    // 如果多个线程同时访问, 有可能会出现多个实例。  

    public static Singleton getInstance() {  

        // 第一次初始化时,多个线程同时执行"if (s == null)",判断结果都为真,所以都会执行下面的操作:"s = new Singleton()",由此引发多个实例的出现。  

        if (s == null) {  

            s = new Singleton();  

        }  

        return s;  

    }  

}

 

解决方法1(不推荐):

public class Singleton {  

    private static Singleton s;  

    private Singleton() {  

    }  

    // 将该方法加上synchronized关键字。这种方法确实能解决问题,但效率不是很高。因为每次调用该方法的时候,都需要阻塞该方法,但事实上只有第一次初始化的时候才会出现这种情况,所以......  

    public static synchronized Singleton getInstance() {  

        if (s == null) {  

            s = new Singleton();  

        }  

        return s;  

    }  

}

 

解决方法2(推荐):

public class Singleton {  

    private static Singleton singleton;  

    private Singleton() {  

    }  

    public static Singleton getInstance() {  

        if (singleton == null) {  

            synchronized (Singleton.class) {  

                if (singleton == null) {  

                    singleton = new Singleton();  

                }  

            }  

        }  

        return singleton;  

    }  

分享到:
评论

相关推荐

    M2_Singleton_单例模式_java_powder53m_arrow51c_

    但这种方式在多线程环境下会出现问题,可能导致多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if ...

    singleton_单例模式_java_设计模式_

    `volatile`关键字确保了多线程环境下的可见性和有序性,避免了指令重排序的问题。 4. 静态内部类(Static Inner Class Singleton): 类的加载是线程安全的,因此这种方式也是线程安全的,且延迟初始化。如下所示...

    ATM.zip_ATM多线程_atm_atm机多线程

    7. **并发模型**:理解Java内存模型(JMM)和并发编程模型,如MESI协议,有助于编写出高效且正确的多线程代码。 8. **事务管理**:ATM操作通常涉及数据库交互,因此需要事务支持以保证原子性、一致性、隔离性和持久...

    JAVA_API_1.7中文版

    1. **多线程增强**:Java 1.7引入了Fork/Join框架,它是一个并行计算模型,通过将大任务分解为小任务来加速执行。`java.util.concurrent.ForkJoinPool`和`java.util.concurrent.RecursiveTask`是其核心类。 2. **...

    Java线程安全的Singleton模式:深入分析与实现

    在Java中创建线程安全的Singleton模式是一项重要的任务,尤其是在多线程环境中。通过使用饿汉式、懒汉式与双重检查锁定、静态内部类或枚举等方式,可以确保Singleton实例的唯一性和线程安全。每种方式都有其适用场景...

    singleton设计模式java实现及对比

    并且由于实例在类加载时就创建,所以不存在多线程下的性能问题。 缺点:Singleton实例在类加载时就被创建,即使可能永远都不会用到,造成了内存浪费。 ### 2. 懒汉式(Synchronized Method) 这种方式是在`...

    Java的Singleton模式代码(免资源分)

    1. **非线程安全**:这个版本在多线程环境下存在安全隐患,多个线程可能会同时进入`if`语句块创建多个实例。 2. **懒加载**:实现了懒加载机制,但没有解决线程安全问题。 3. **简单性**:相对于双重检查锁定,该...

    (创建型模式)Singleton模式

    但是这种方式在多线程环境下是不安全的,可能导致多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if ...

    java_elevator.rar_Java电梯程序_java 电梯_电梯 模拟 系统_电梯调度_电梯调度 java

    在Java编程领域,电梯模拟系统是一个经典的多线程问题,用于演示并发控制和调度策略。这个"java_elevator.rar"项目就是一个很好的实例,它通过Java语言实现了一个包含5台电梯和20层楼的电梯调度系统。下面我们将深入...

    CoreJava_Bank

    在Java编程中,Core Java是指Java的基础部分,包括类、对象、接口、异常处理、集合框架、多线程、输入输出、网络编程等核心概念和技术。在这个项目中,我们可以看到以下关键知识点: 1. **面向对象编程**:Java是一...

    java_hotel.rar_ java hotel_Java 酒店管理系统_毕业设计_酒店管理系统 java

    综上所述,Java酒店管理系统涵盖了Java编程、数据库操作、GUI设计、多线程、异常处理等多个核心知识点,是学习和实践Java技术的绝佳案例。通过深入理解和分析这个项目,开发者能够提升在企业级应用开发方面的能力。

    多线程下的singleton

    标题中的“多线程下的Singleton”指的是在编程中如何在多线程环境下正确实现单例模式。单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,如果不妥善处理,可能会导致多个...

    Java Socket/ServerSocket 多线程下聊天室系统

    Java Socket和ServerSocket是Java网络编程中的...总的来说,这个基于Java Socket/ServerSocket的多线程聊天室系统充分展示了Java网络编程的核心技术和设计原则,是学习和实践网络通信、并发处理和对象传输的优秀案例。

    Android Singleton单例模式Demo

    2. 数据库连接管理:在多线程环境下,共享数据库连接池以提高性能和减少资源消耗。 3. 资源共享:如网络请求、图片加载等,通过单例可以避免重复加载和内存浪费。 接下来,我们将通过一个简单的SingletonTest示例来...

    java Singleton单例模式

    这种实现方式在第一次调用`getInstance()`时才创建实例,但在多线程环境下不安全。 3. 懒汉式(线程安全 - 同步方法) ```java public class Singleton { private static Singleton instance; private ...

    Java并行(4):线程安全前传之Singleton1

    Singleton模式在Java多线程环境中的实现需要注意线程安全问题。传统的懒汉式实现可能会导致多个实例,而使用同步方法虽然解决了安全性问题,但效率较低。双检锁(DCL)在Java 5及以上版本中提供了较好的平衡,既保证...

    Java多线程编程环境中单例模式的实现

    ### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...

    jiao_java_

    总之,"jiao_java_"项目结合了Java的后端编程能力与杀毒软件或用户账号系统的功能需求,涉及了多方面的编程技术和概念。通过研究这个项目,开发者不仅可以提升Java编程技巧,还能学习如何构建安全、高效的系统。

    java线程.pdf

    为了保证数据的一致性,在多线程环境中需要对共享资源进行同步访问。Java提供了多种机制来实现线程间的同步,包括`synchronized`关键字、显式锁(`ReentrantLock`)、`volatile`关键字等。 #### synchronized关键字 ...

    atm.rar_atm_atm java_atm simulation _java ATM 模拟_java atm simul

    8. **多线程**:在高级模拟中,可能会考虑多线程来模拟多个用户同时使用ATM的情况,确保并发安全。 9. **设计模式**:根据系统复杂性,开发者可能需要运用单例模式(Singleton)来保证ATM实例的唯一性,工厂模式...

Global site tag (gtag.js) - Google Analytics