单例设计模式---懒汉式的多线程安全隐患

public class Single {
    private static Single s=null;
    private Single(){
        
    }
    
    public static Single getInstance(){
/*        if(s==null){  //如果是多线程,会出现多个类名进来,可能冻结,然后醒来加载多个对象
            s=new Single(); //然后new 出多个对象
        }
        return s;*/
        
        
        //解决上面的安全隐患问题
        if(s==null){ //判断s是不是空
            synchronized(Single.class){ //s是空后,进来,用同步锁锁住进来的类名,
                //同步锁锁住不是this,因为静态函数进内存时还没有对象,但是一定有对应的字节码文件对象:类名.class 该对象的类型是class
                
                if(s==null){  //判断s是不是空,是空就new一个对象
                    s=new Single();
                }
            }
        }
        return s;
    }
}

时间: 2024-11-06 07:14:41

单例设计模式---懒汉式的多线程安全隐患的相关文章

设计模式课程 设计模式精讲 8-2 单例设计模式-懒汉式及多线程Debug实战

1 主要内容 1.1 核心功能点 2 代码演练 2.1 单线程调用 2.2 多线程调用 1 主要内容 1.1 核心功能点 2 代码演练 2.1 单线程调用 测试类: package com.geely.design.pattern.creational.singleton; public class Test { public static void main(String [] args){ //这样写异常,因为构造方法私有 // LazySingleton lazySingleton = n

单例设计模式懒汉式和恶汉式

一,单例设计模式懒汉式和恶汉式 懒汉式在类加载时不初始化,延迟加载.(配置文件) 饿汉式在类加载时初始化,加载慢,获取对象快. 饿汉式是线程安全的, 懒汉式需要加synchronized,否则不安全. 二,饿汉式 1 public class Singletonehan { 2 private static Singletonehan singleton=new Singletonehan(); 3 private Singletonehan() { 4 } 5 public static Si

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()

Spring -11 -单例设计模式 -懒汉式/饿汉式(idea默认的)

单例设计模式 作用: 在应用程序有保证最多只能有一个实例. 好处: 2.1 提升运行效率. 2.2 实现数据共享. 案例:application 对象 懒汉式 3.1 对象只有被调用时才去创建. 3.2  示例代码 3.3由于添加了锁,所以导致效率低. public class lazySingleton { //懒汉式,单例模式! //由于对象需要被静态方法调用,把方法设置为static //由于对象是static,必须要设置访问权限修饰符为private , //如果是public 可以直接

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

package com.Thread; /** * 单例设计模式:确保一个类只有一个对象 */ public class Synchronized_Singleton { public static void main(String[] args) { JvmThread jvm1= new JvmThread(100); JvmThread jvm2= new JvmThread(100); jvm1.start(); jvm2.start(); } } /** * 懒汉式(饿汉式:在声明静态

单例设计模式懒汉式的缺陷

http://icyfenix.iteye.com/blog/575052 IcyFenix 探索设计模式之六——单例模式 设计模式Spring应用服务器多线程JVM 6.单例模式(Singleton Pattern) 前面说提到的五种创建模式,主要解决的问题是如何创建对象,获得产品.而单例模式最要关心的则是对象创建的次数以及何时被创建. Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图).但是如果在“对象创建的次数以及何时被创建”这两点上较真起来,S

JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

public class Main { { //构造块(在构造对象时调用,先于构造方法执行) System.out.println("我是构造块!"); } static{ //静态块(在类加载时执行,且只执行一次[在构造块前执行]eg:数据库连接) System.out.println("我是静态块!"); } public Main(){ System.out.println("我是构造方法!"); } public static void

线程安全问题-单例设计模式

第一种:饿汉式单例设计模式 在类加载的时候就创建好了一个静态的对象供系统使用,以后不再改变,所以天生就是线程安全的. 但是初始化就占用了系统的资源. package thread; /* * 饿汉式单例模式:饿汉式在类一创建的时候就已经创建好了一个静态的对象供系统使用,以后不再改变,所以天生就是线程安全的 */ class Singleton3{ private Singleton3(){ } private static final Singleton3 INSTANCE = new Sing

Java设计模式之一 单例设计模式

1.什么叫设计模式: 设计模式的概念首先来源于其它行业:建筑业,在早起建房子的时候,肯定是经验缺乏.显得杂乱无序的,这就会造成很多问题,在行业发展过程,通过不断的经验积累,前辈们针对这些问题提出了合理解决方案,这就是设计模式,参照设计模式往往可以解决很多问题,在计算机编程方面,也会出现类似问题,所以牛人们把这些解决问题的方案进行归类和总结,形成了面向对象编程的23种设计模式. 2.单例模式(特点): Java中单例模式定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供."通过