专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Java多线程单例模式

Java多线程单例模式

更新时间:2020-11-09 17:28:12 来源:动力节点 浏览1002次

 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。对于一个软件系统中的某些类而言,只有一个实例很重要,例如一个系统只能有一个窗口管理器或文件系统,一个系统只能有一个集市工具或ID生成器等等。本文就和大家一起探讨一下在多线程环境下,单例模式的相关问题。

单例模式的定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。


1. 单例对象的属性(或成员变量)的获取,是通过单例对象的初始化实现的。也就是说,在单例对象初始化时,会从文件或数据库中读取最新的配置信息。

2. 其他对象不能直接改变单例对象的属性,单例对象属性的变化来源于配置文件或配置数据库数据的变化。

多线程单例模式的实现:


一、基于饿汉式单例:

实例代码

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton() {

}

public static Singleton getInstance() {

return instance;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Singleton s1, s2;

s1 = Singleton.getInstance();

s2 = Singleton.getInstance();

if(s1 == s2){

System.out.println("两个对象是相同实例");

}

else{

System.out.println("两个对象是不同实例");

}

}

}


二、基于懒汉式单例

实例代码

public class Singleton {

private Singleton() {

}

//静态内部类

private static class SingletonHandler {

private final static Singleton instance = new Singleton();

}

public static Singleton getInstance() {

return SingletonHandler.instance;

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Singleton s1, s2;

s1 = Singleton.getInstance();

s2 = Singleton.getInstance();

System.out.println("两个对象实例是否相同?");

System.out.println(s1 == s2);

}

}

三、饿汉式与懒汉式的比较:

饿汉式单例类在类加载时就将自己实例化,它的优点在于无需考虑多个线程同时访问的问题,可以确保实例的唯一性;从调用速度和反应时间速度来讲,由于单例对象一开始就得以创建,因此要优于懒汉式单例。但是无论系统在运行时是否需要使用该单例对象,由于在类加载时该对象就需要创建,因此从资源利用效率角度来讲饿汉式单例不及懒汉式单例,而且在系统加载时由于需要创建饿汉式单例对象,加载时间可能会比较长。

懒汉式单例类在第一次使用时创建,无须一直占用系统资源,实现了延迟加载,但是必须要处理多个线程同时访问的问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的几率比较大,需要通过同步化机制进行控制。


单例模式的主要优点在于提供了对唯一实例的受控访问并可以节约系统资源;其主要缺点在于因为缺少抽象层而难以扩展,且单例类职责过重。至于我们在多线程中实际运用单例模式时采用恶汉式还是懒汉式单例类需要根据实际情况,对照上述的两者的特征做出合适的选择。


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>