04单例模式,饿汉和懒汉分别存在的问题(阿里面试题)
单例设计模式:核心思想:就是这个类,在程序的任何其他模块中,获取它的对象时,拿到的永远是同一个对象。单例模式有两种写法:懒汉式和饿汉式。懒汉式:若为空,则创建一个;若不为空,则直接返回。publicclassProductDb{publicHashMap<String,String>pMap=newHashMap<>();staticProductDbpdb=null;privateProductDb(){}publicstaticsynchronizedProductDbgetProductDb(){if(pdb==null){pdb=newProductDb();}returnpdb;}饿汉式:先创建一个,别人调用的时候都返回这一个。publicclassProductDb2{publicHashMap<String,String>pMap=newHashMap<>();staticProductDb2pdb=newProductDb2();privateProductDb2(){}publicstaticProductDb2getProductDb(){returnpdb;}}懒汉式存在问题:判断是否为空以及创建一个新的对象并非原子操作。若用多线程来操作可能会同时创建多个新的对象,需要加锁。PublicclassProductDb{publicHashMap<String,String>pMap=newHashMap<>();staticProductDbpdb=null;privateProduct(){//构造方法要为私有}publicstaticProductDbgetProductDb(){if(pdb==null){synchronized(pdb){if(pdb==null){pdb=newProductDb();}}}returnpdb;}}
来自:设计模式-单例模式