服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - java单例模式学习示例

java单例模式学习示例

2019-10-30 17:05java技术网 JAVA教程

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种,下面提供了单例模式的示例

单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

首先看一个经典的单例实现。

复制代码代码如下:


public class Singleton {

 

private static Singleton uniqueInstance = null;

private Singleton() {

   // Exists only to defeat instantiation.

}

public static Singleton getInstance() {   if (uniqueInstance == null) {

       uniqueInstance = new Singleton();

   }

   return uniqueInstance;

}

// Other methods...
}

 

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。

 

复制代码代码如下:


//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}

 

//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意,这里没有final
private static Singleton2 single=null;
//静态工厂方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}

 

延伸 · 阅读

精彩推荐
  • JAVA教程Java泛型的简单实例

    Java泛型的简单实例

    这篇文章介绍了Java泛型的简单实例,有需要的朋友可以参考一下 ...

    java技术网4932019-10-16
  • JAVA教程java jdk动态代理详解

    java jdk动态代理详解

    动态代理类的Class实例是怎么生成的呢,是通过ProxyGenerator类来生成动态代理类的class字节流,把它载入方法区 ...

    java技术网1352019-10-14
  • JAVA教程scala中常用特殊符号详解

    scala中常用特殊符号详解

    这篇文章主要介绍了scala中常用特殊符号详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    咸鱼2342019-07-08
  • JAVA教程des加密解密JAVA与.NET互通实例

    des加密解密JAVA与.NET互通实例

    这篇文章主要介绍了des加密解密JAVA与.NET互通实例,大家参考使用吧 ...

    java技术网2612019-10-25
  • JAVA教程java jni调用c函数实例分享(java调用c函数)

    java jni调用c函数实例分享(java调用c函数)

    Java代码中调用C/C++代码,当然是使用JNI,JNI是Java native interface的简写,可以译作Java原生接口,下面看实例吧 ...

    java教程网1442019-10-26
  • JAVA教程JAVA8 十大新特性详解

    JAVA8 十大新特性详解

    本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新...

    网络4712019-06-17
  • JAVA教程如何使用Java生成具有安全哈希的QR码

    如何使用Java生成具有安全哈希的QR码

    这篇文章主要介绍了如何使用Java生成具有安全哈希的QR码,这是关于如何在Java中使用salt生成QR代码和安全散列字符串的分步教程。,需要的朋友可以参考下...

    Java_苏先生5032019-06-29
  • JAVA教程java web项目实现文件下载实例代码

    java web项目实现文件下载实例代码

    现在项目里面有个需求,需要把系统产生的日志文件给下载到本地 先获取所有的日志文件列表,显示到界面,选择一个日志文件,把文件名传到后台 ...

    java代码网2272019-10-15