zoukankan      html  css  js  c++  java
  • ------------单例总结--------------

    1.什么是单例?

    单例就是某个类在项目进行的生命周期中,永远只有一个实例

    2.单例和单例模式的区别?

    单例模式是实现单例的方法之一

    (注意: spring中每个被管理bean默认是单例的,它是否使用了单例模式?    没有使用单例模式 )

    <bean id="xxx"  class="bean的全名称">.....

    3.什么是单例模式?

    如果满足以下3点的才是使用了单例模式

    (1) 类本身的构造方法必须私有

    (2)类本身提供一个自己的实例

    (3)必须对外提供一个可以访问这个唯一实例的方法

    4.单例模式的分类?

    饿汉式  (没有线程安全问题)

    public class SendURL {
    	
    	//类本身提供一个自己的实例
    	private static SendURL instance =new SendURL();
    	
    	//类本身的构造方法必须私有
    	private SendURL() {}
    	
    	//必须对外提供一个可以访问这个唯一实例的方法
    	public static SendURL getInstance() {
    		return instance;
    	}
    }

    懒汉式  延迟加载(存在线程安全问题)

     

    public class SendURL {
    
    	//类本身提供一个自己的实例
    	private volatile static SendURL instance = null;
    	
    	//类本身的构造方法必须私有
    	private SendURL() {}
    	
    	//必须对外提供一个可以访问这个唯一实例的方法
    	public static SendURL getInstance() {
               
                if(instance == null){
                    //t1  t2  t3 在多个线程同时运行时,很有可能会产生多个实例对象
                    synchronized(SendURL.class) {
    
                  if(instance == null) {
                            instance =new SendURL();
                        }
                     }
                 } 
               return instance; 
             } 
    }
    

      

     

    5.单例模式的线程安全问题

    (懒汉式有线程安全问题)

    问题:在多个线程同时运行时,很有可能会产生多个实例对象,导致线程安全问题 ?

    使用同步的方法解决这个问题,加上synchronized关键字

     但是这样的写法线程还是不安全,因为两个线程可以同时进入if语句,线程A实例化对象返回之后,线程B不用经过判断能再实例化对象,并且返回另一个对象

    所以又提出一种新的模式——Initialization on Demand Holder. 这种方法使用内部类来做到延迟加载对象,在初始化这个内部类的时候,

    JLS(Java Language Sepcification)会保证这个类的线程安全

  • 相关阅读:
    c语言中限制用户输入整数
    c语言 输入验证(限制输入正数)
    c语言中只读取输入的一行字符的首个字符
    python如何通过代码自动免密登陆ssh
    计算机科学速成课 02:电子计算机、继电器、术语“bug”的来源、真空管、晶体管、发展路径 转
    golang ...用法
    01 _ 程序的运行过程:从代码到机器运行
    深入Golang调度器之GMP模型 转
    golang可视化
    修改默认输入法,用英文标点符号
  • 原文地址:https://www.cnblogs.com/helloaugust/p/11561550.html
Copyright © 2011-2022 走看看