博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见设计模式---单例设计模式
阅读量:6802 次
发布时间:2019-06-26

本文共 2575 字,大约阅读时间需要 8 分钟。

单例设计模式

  • 饿汉式
  • 懒汉式
  • 双重线程检查式

饿汉式

public class Person {        private static final Person person=new Person();//常量  在第一次加载这个类时就有了  没法改变    private String  nameString;    public String getNameString() {        return nameString;    }    public void setNameString(String nameString) {        this.nameString = nameString;    }    //构造私有化    private Person(){            }    public static Person getPerson(){                return person;    }}

懒汉式

注意:有线程安全问题-----------------------------------懒汉式

多线程中,可能有多个调用,第一个线程判断为null,于是进行下边,但是在初始化过程中,下一个线程进来,而第一个初始化还没有完成,于是这两个线程都通过null判断

 

public class Person {        private static Person person;    private String  nameString;    public String getNameString() {        return nameString;    }    public void setNameString(String nameString) {        this.nameString = nameString;    }    //构造私有化    private Person(){    }    public static Person getPerson(){//通过if判断--------------        if (person==null) {            person=new Person();        }        return person;    }}

解决方法:

同步

 

public class Person {        private static Person person;    private String  nameString;    public String getNameString() {        return nameString;    }    public void setNameString(String nameString) {        this.nameString = nameString;    }    //构造私有化    private Person(){    }    public static synchronized Person getPerson(){//加锁        if (person==null) {            person=new Person();        }        return person;    }}

 

 

上一个解决的不够完美,但是多线程中还是存在线程安全

public static synchronized Person getPerson(){
//这个代码中,只有person=new Person();被执行一次,因此为了高效率 无需将整个方法同步 if (person==null) { person=new Person(); } return person; }

重点:

public static  Person getPerson(){        if (person==null) {            synchronized (Person.class) {                person=new Person();            }                    }        return person;    }

双重线程检查式

也涉及到线程安全问题,有可能两个方法几乎同时踏进if判断中,但是在return过程中,第一个还没完,第二个可能通过锁所以还需进行判断:

 

public class Person {    private static Person person;    private String  nameString;    public String getNameString() {        return nameString;    }    public void setNameString(String nameString) {        this.nameString = nameString;    }    //构造私有化    private Person(){    }    public static  Person getPerson(){        if (person==null) {            synchronized (Person.class) {                if (person==null) {                    person=new Person();                                    }            }                    }        return person;    }}

 

转载于:https://www.cnblogs.com/wangsr-suc/p/8878225.html

你可能感兴趣的文章
dubbo原理
查看>>
SQL server 清除缓存
查看>>
python实现常见排序算法
查看>>
listctrl加入图标
查看>>
gem 更新源设置,ruby安装
查看>>
码农们:我们才是真正的土豪!
查看>>
[Node.js]NPM 使用
查看>>
Setup Factory打包winform程序
查看>>
window下php5.6-x64-ts可用php_redis.dll文件
查看>>
namenode 格式化错误 Unable to check if JNs are ready for formatting
查看>>
通达信公式-均线向上
查看>>
Redis ---------- Sort Set排序集合类型
查看>>
Android 子线程更新UI 异常
查看>>
20190404——分享
查看>>
20 个 Laravel Eloquent 必备的实用技巧
查看>>
H5的draggable属性和jqueryUI.sortable
查看>>
时间复杂度和空间复杂度
查看>>
NRF52832 能烧写代码 但是不运行 ,是因为没有烧写协议栈
查看>>
《android深入探索》第二章心得
查看>>
Hdu-6119 小小粉丝度度熊 尺取
查看>>