单例设计模式


设计模式:

                   对问题行之有效的解决方式,是一种思想

      1.单例设计模式

                   解决的问题:就是可以保证一个类在内存中的对象唯一性

                   需求:

                            必须对于多个程序使用同一个配置信息对象时,就要保证该对象的唯一性

                           

                   如何保证对象唯一性?

                            1.不允许其他程序用new创建该类对象

                            .在该类创建一个本类实例。

                            .对外提供一个方法让其他程序可以获取该对象。

                   步骤:

                            .私有化该类构造凤方法。这样就不能再类外创建实例了

                            .通过new在本类中创建一个本类对象

                            3.定义一个公有的方法,将创建的对象返回

                   例如:

                     饿汉式

                            classSingle{

                                     privatestatic Single = new Single();//类加载完,对象就已经存在了

                                     private  Single(){};

                                     publicstatic Single getInstance(){

                                               returns;

                                     }

                                    

                            }

                            publicstatic void main(String[]args){

                                     Singless = Single.getInstance();

                                     Singles1 = Single.getInstance();

                                     System.out.println(ss==s1);//true;

                            }

                     //懒汉式

                            class  Single2{

                                     privatestatic Single s = null;

                                     //类加载进来,没有对象,只有调用了getInstance()方法时,才在堆中创建对象

                                     //延迟加载

                                     privateSingle(){};

                                     publicstatic Single getInstance(){

                                               if(s==null){

                                                        s  = new Single();

                                               }

                                               returns;

                                     }

                            }

验证懒汉式在多线程中可以创建多个实例(自己原创)

 

                                     packagecom.sdut.day14;

 

                            publicclass ThreadDemo {

 

                                     /**

                                      * @param args

                                      */

                                     publicstatic void main(String[] args) {

                                               MyThreadmyThead1 = new MyThread("张三");

                                               MyThreadmyThead2 = new MyThread("李四");

                                               Threadt1 = new Thread(myThead1);

                                               Threadt2 = new Thread(myThead2);

                                               t1.start();

                                               t2.start();

                                               try{

                                                        Thread.sleep(2000);

                                               }catch (InterruptedException e) {

                                                        //TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                               //开始验证

                                               System.out.println(myThead1.getCon().getName());

                                               System.out.println(myThead2.getCon().getName());

                                     }

 

                            }

                            classConfigTest {//建立懒汉式

                                     privatestatic ConfigTest test= null;

                                     privateConfigTest(){};

                                     privateString name ;

                                     publicString getName() {

                                               returnname;

                                     }

                                     publicvoid setName(String name) {

                                               this.name= name;

                                     }

                                     publicstatic ConfigTest getInstance(){

                                                        if(test==null){

                                                                 try{

                                                                           Thread.sleep(1000);//验证多线程的不安全行,此处挺一会

                                                                 }catch (InterruptedException e) {

                                                                           //TODO Auto-generated catch block

                                                                           e.printStackTrace();

                                                                 }

                                                                 test= new ConfigTest();

                                                        }

                                                        returntest;

                                     }

                            }

                            //创建验证任务

                            classMyThread implements Runnable{

                                     privateString name ;

                                     privateConfigTest con;

                                     publicConfigTest getCon() {

                                               returncon;

                                     }

 

                                     publicvoid setCon(ConfigTest con) {

                                               this.con= con;

                                     }

 

                                     publicMyThread(String name) {

                                               super();

                                               this.name= name;

                                     }

                                    

                                     publicvoid run(){

                                                con = ConfigTest.getInstance();//获取实例

                                               con.setName(name);//通过设置的名字相同来确定是否时创建了两个实例

                                     }

                            }

      解决方法,在懒汉式单例模式加入锁。

                   publicstatic ConfigTest getInstance(){

                            synchronized(MyThread.class){

                                     if(test==null){

                                               try{

                                                        Thread.sleep(1000);//验证多线程的不安全行,此处挺一会

                                               }catch (InterruptedException e) {

                                                        //TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                               test= new ConfigTest();

                                     }

                            }

                                     returntest;

                   }

         }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值