25 多线程设计模式

一、单例设计模模式

    -------------------------保证类在内存中只有一个对象。

问题一:如何保证在内存中只有一个对象呢?

答:(1)控制类的创建,不让其他类来创建本类的对象。private

        (2)在本类中定义一个本类的对象。Singleton s;

        (3)提供公共的访问方式。public static Singleton getInstance(){return s}

A:单例模式写法两种:

    (1)饿汉式     开发用这种方式

    //饿汉式
class Singleton {
//1,私有构造函数
private Singleton(){}
//2,创建本类对象
private static Singleton s = new Singleton();
//3,对外提供公共的访问方法
public static Singleton getInstance() {
return s;
}
public static void print() {
System.out.println("11111111111");
}
}

    (2)懒汉式   面试写这种。                     

    //懒汉式,单例的延迟加载模式
class Singleton {
//1,私有构造函数
private Singleton(){}
//2,声明一个本类的引用
private static Singleton s;
//3,对外提供公共的访问方法
public static Singleton getInstance() {
if(s == null)
//线程1,线程2
s = new Singleton();
return s;
}
public static void print() {
System.out.println("11111111111");
}
}

    (3)第三种格式

                    class Singleton {
private Singleton() {}
public static final Singleton s = new Singleton();//final是最终的意思,被final修饰的变量不可以被更改
}

public class Demo1_Singleton {	
    /**	 
    * @param args	 
    * 
    * 单例设计模式:保证类在内存中只有一个对象。	 
    */	
    public static void main(String[] args) {	
	/*Singleton s1 = new Singleton();	
	Singleton s1 = Singleton.s;	//成员变量被私有,不能通过类名.调用		
        Singleton.s = null;		
        Singleton s2 = Singleton.s;	
	System.out.println(s1 == s2);
        */				
        Singleton s1 = Singleton.getInstance();		
        Singleton s2 = Singleton.getInstance();		
        System.out.println(s1 == s2);	//true
    }
}
    /* 
    * 饿汉式
    */
class Singleton {	
    //1,私有构造方法,其他类不能访问该构造方法了	
    private Singleton(){}	
    //2,创建本类对象	
    private static Singleton s = new Singleton();	
    //3,对外提供公共的访问方法	
    public static Singleton getInstance() {	//获取实例		
            return s;	
    }
}
public class Demo2_Singleton {	
    /*	 
    * 饿汉式和懒汉式的区别	 
    * 1,饿汉式是空间换时间,懒汉式是时间换空间	
    * 2,在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能会创建多个对象	 
    */	
    public static void main(String[] args) {
         Singleton s1 = Singleton.getInstance();	
	 Singleton s2 = Singleton.getInstance();		
	 System.out.println(s1 == s2);	
    }
}
    /* 
    * 懒汉式,单例的延迟加载模式 
    */
class Singleton {	
    //1,私有构造方法,其他类不能访问该构造方法了	
    private Singleton(){}	
    //2,声明一个引用	
    private static Singleton s ;	
    //3,对外提供公共的访问方法	
    public static Singleton getInstance() {		//获取实例	
	if(s == null) {			
            //线程1等待,线程2等待			
            s = new Singleton();		
        }				
        return s;	
    }
}
public class Demo3_Singleton {	
/**	 
* @param args	 
* 
* 单例设计模式:保证类在内存中只有一个对象。	
 */	
    public static void main(String[] args) {	
	    //Singleton s1 = new Singleton();		
	      Singleton s1 = Singleton.s;	//成员变量被私有,不能通过类名.调用		
            //Singleton.s = null;		
              Singleton s2 = Singleton.s;			
	      System.out.println(s1 == s2);		
    }
}
class Singleton {	
    //1,私有构造方法,其他类不能访问该构造方法了	
    private Singleton(){}	
    //2,声明一个引用	
    public static final Singleton s = new Singleton();	
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值