java单例模式(双重检查加锁)的原因

public class Singleton{
   private static Singleton instance = null;//是否是final的不重要,因为最多只可能实例化一次。
   private Singleton(){}
   public static Singleton getInstance(){
       if(instance == null){
           //双重检查加锁,只有在第一次实例化时,才启用同步机制,提高了性能。
           synchronized(Singleton.Class){
               if(instance == null){
                   instance = new Singleton();
               }
           }
       }
       return instance;
   }

 双重检查加锁,只有在第一次实例化时,才启用同步机制,提高了性能。 

原文地址:https://www.cnblogs.com/ganchuanpu/p/9210703.html

时间: 2024-10-09 05:06:43

java单例模式(双重检查加锁)的原因的相关文章

单例模式-双重检查加锁

(参考:http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html) 双重检查加锁: (1)既实现线程安全,又能够使性能不受很大的影响.那么什么是“双重检查加锁”机制呢? (2)所谓“双重检查加锁”机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创

糟糕的双重检查加锁(DCL)

在Java并发编程时,同步都会存在着巨大的性能开销,因此,人们使用了很多的技巧来降低同步的影响,这其中有一些技巧很好,但是也有一些技巧存在一些缺陷,下面要结束的双重检查加锁(DCL)就是有缺陷的一类. 由于早期的JVM在性能上存在一些有待优化的地方,因此在并发编程中,延迟初始化经常被用来降低程序的开销.编写正确的延迟初始化需要使用同步,但是直接在初始化之前使用同步会对性能产生影响.所以一些人就提出了双重检查加锁,并声称能够解决这个矛盾.如图所示就是双重检查加锁的代码. 上图代码中,对Resour

【深入】java 单例模式(转)

[深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便萌生了写这篇文章的念头.企图把这个单例说透,说深入.但愿我不会做的太差. 首先来看一个典型的实现: 1 /** 2 * 基础的单例模式,Lazy模式,非线程安全 3 * 优点:lazy,初次使用时实例化单例,避免资源浪费 4 * 缺点:1.lazy,如果实例初始化非常耗时,初始使用时,可能造成性能问

Java单例模式以及线程安全性的保证

1.单例模式有什么用处? 有一些对象只能使用一个,例如:数据库连接.线程池(threadpool).缓存(cache).对话框.处理偏好(preferences)设置和这侧表(registry)的对象.日志对象.充当打印机.显卡等设备的驱动程序的对象,即用于管理共享的资源.这种对象只能有一个实例,制造多个会导致问题. 2.最经典的单例模式?         /**      * 1.利用一个私有静态变量来记录Singleton类的唯一实例:      * 2.构造器声明为私有,只有Singlet

java单例模式的几种实现

单例模式是用来保证这个类在运行期间只会被创建一个类实例,另外,单例模式提供了一个全局唯一访问这个类实例的访问点,就是getInstance方法. 对于单例模式而言,不管采用何种实现方式,它都只是关心类实例的创建问题,不关心具体的业务功能. 第一种方案:懒汉式 懒汉式的类的实例创建是在getInstance方法中,懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间.当然,如果一直没人使用的话,那就不会创建实例,则节约内存空间 package 单例模式; /

9种Java单例模式详解(推荐)

单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外部需要创建实例化对象时再进行实例化,进而达到Lazy Loading 的效果. 通过静态方法 getSingleton() 和private 权限构造方法为创建一个实例化对象提供唯一的途径. 不足:未考虑到多线程的情况下可能会存在多个访问者同时访问,发生构造出多个对象的问题,所以在多线程下不可用这种

java 单例模式总结

单例模式的实现方式总结: 第一种方式:同步获取实例的方法,多线程安全,懒汉模式.在调用实例的时刻初始化. public class Singleton1 { private static Singleton1 instance = null; private Singleton1() { } public static synchronized Singleton1 getInstance() { if (instance == null) { instance = new Singleton1

java 单例模式5种写法

学习整理 饱汉模式(懒汉模式) 1 // 饱汉 2 // UnThreadSafe 3 public class Singleton1 { 4 private static Singleton1 singleton = null; 5 private Singleton1() { 6 } 7 public static Singleton1 getInstance() { 8 if (singleton == null) { 9 singleton = new Singleton1(); 10

Java单例模式中双重检查锁的问题

单例创建模式是一个通用的编程习语.和多线程一起使用时,必需使用某种类型的同步.在努力创建更有效的代码时,Java 程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量.然而,由于一些不太常见的 Java 内存模型细节的原因,并不能保证这个双重检查锁定习语有效. 它偶尔会失败,而不是总失败.此外,它失败的原因并不明显,还包含 Java 内存模型的一些隐秘细节.这些事实将导致代码失败,原因是双重检查锁定难于跟踪.在本文余下的部分里,我们将详细介绍双重检查锁定习语,从而理解它