java单例模式学习笔记

  最近一直在学习多线程,在学习过程中遇到了关于单例模式的多线程安全问题,内容如下:

  一:首先什么是单例模式

  单例模式具有的三要点:

  • 一个类只能有一个实例;
  • 必须是由它自己创建的这个实例;
  • 它必须自行向外界提供这个实例;

  优点:

  1. 节以保证访问的对象实例的唯一性;
  2. 对于经常使用的类来说设计出单例模式可以节省资源,比如工具类;

  二:单例模式的几种写法  

/**
 * 1:懒汉模式
 * 缺点:存在线程安全问题
 * @author 丁**
 *
 */
class DanLiModel {
    private static DanLiModel instance = null;
    private DanLiModel(){};//外界就不能构造新的对象
    public static DanLiModel getInstance(){
        if(instance == null){
            instance = new DanLiModel();
        }
        return instance;
    }
}
/**
 * 2:饿汉模式
 * 不存在线程安全问题
 * @author 丁**
 *
 */
class DanLiModel1 {
    private static DanLiModel1 instance = new DanLiModel1();
    private DanLiModel1(){};
    public static DanLiModel1 getInstance(){
        return instance;
    }
}

那么懒汉模式的线程安全问题何修改:

 //本来可以这样使用:
 synchronized public static DanLiModel3 getInstance(){
        if(instance == null){
            instance = new DanLiModel3();
        }
        return instance;
    }
//但是synchronized同步方法的性能不高,应该尽量减少它的作用域;

所以在这里使用了双重检查机制保证线程安全的同时尽量减少synchronized的作用域,提高性能:

/**
* 第一层检查:并不是每次有新的线程进入都得同步一次,如果已经实例化过对象了,就直接返回实例;
 * 第二层检查:进入同步块后创建一个新的对象
 * 关于同步锁:
 * 每一个对象都有一个同步锁;
 * 锁可以保护代码片段,保证了任何时刻只有一个线程执行被保护的代码;
 * 对于非 static方法,同步锁就是该方法所属类的对象
 * 对于static方法,同步锁就是该方法所属的类的字节码对象:DanLiModel3.class
 * 优点:解决了原来的线程安全问题
 */
class DanLiModel3{
    private static DanLiModel3 instance = null;
    private DanLiModel3(){};//外界就不能构造新的对象
    public static DanLiModel3 getInstance(){
        if(instance == null){
            synchronized(DanLiModel3.class){
                if(instance == null){
                    instance = new DanLiModel3();
                }
            }
        }
        return instance;
    }
}

ps:

过完年就要去找工作了,打算空闲的这些天把线程,集合,数据结构给补补,然后将实战项目做完(可以当做面试展示的内容之一啦)

,最后在网上看看常问的面试题目。哎,我这个小菜鸟!

posted @ 2018-02-08 10:25  御龙高手  阅读(217)  评论(0编辑  收藏  举报