Java之兩種單例模式和懶漢式存在的缺陷及解決

1.單例設計模式

解決的問題:就是可以保證一個類在內存中的對象唯一性。比如對於多個程序使用同一個配置信息對象時,就需要保證該對象的唯一性。

如何保證對象的唯一性呢?
1.不允許其他程序用new來創建該類對象。
2.在該類中創建一個本類實例。
3.對外提供一個方法讓其他程序可以獲取該對象。

步驟:
1.私有化該類的構造函數
2.通過new在本類中創建的一個本類對象
3.定義一個公有的靜態方法,將創建的對象返回

單例模式之餓漢式

代碼:

package day08;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

public class ConfigureFile {
	private static final ConfigureFile configureFile=new ConfigureFile();
	private ConfigureFile()
	{}
	public static ConfigureFile getInstance()
	{
		return configureFile;
	}
	public HashMap<String,String> getInfo() throws IOException
	{
		HashMap<String,String> map=new HashMap<String, String>();
		Properties p=new Properties();
		FileReader fr=new FileReader("D:\\1.properties");
		p.load(fr);
//		Enumeration<?> en=p.propertyNames();
//		ArrayList<?> list=Collections.list(en);
//		for(ListIterator<?> it=list.listIterator();it.hasNext();)
//		{
//			String key=(String)it.next();
//			map.put(key, p.getProperty(key));
//		}
		Set<String> set=p.stringPropertyNames();
		for(Iterator<String> it=set.iterator();it.hasNext();)
		{
			String key=it.next();
			map.put(key, p.getProperty(key));
		}
		return map;
	}
}

package day08;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class SingleEntityMode {
	public static void main(String[] args) throws IOException
	{
		ConfigureFile configure=ConfigureFile.getInstance();
		HashMap<String, String> map=configure.getInfo();
		//keySet(),entrySet(),values等方法遍歷地圖
		Set<Entry<String, String>> set=map.entrySet();
		for(Iterator<Entry<String, String>> it=set.iterator();it.hasNext();)
		{
			Entry<String, String> e=it.next();
			String key=e.getKey();
			String value=e.getValue();
			System.out.println(key+" : "+value);
		}
	}
}

單例模式之懶漢式

代碼如下:

package day08;

public class LazyMenMode {
	private static LazyMenMode lazy;
	private LazyMenMode()
	{}
	public static LazyMenMode getInstance()
	{
		if(null==lazy)
		{
			lazy = new LazyMenMode();
		}
		return lazy;
	}
}

不過這種在多線程中,存在線程安全問題。以下來分析一下,比如線程1和線程2在獲取該類實例,線程1進來判斷null==lazy成立後,沒有執行下去,就被中斷了,這時線程2進來就會產生兩個不同的實例,就不能保證該類在內存中的實例唯一。改進如下:

package day08;

public class LazyMenMode {
	private static LazyMenMode lazy;
	private LazyMenMode()
	{}
	public static LazyMenMode getInstance()
	{
		if(null==lazy)
		{
			synchronized(LazyMenMode.class)
			{
				if(null==lazy)
				{
					lazy = new LazyMenMode();
				}
			}
		}
		return lazy;
	}
}

如此就儘可能的減小了鎖對運行效率的影響。

                                                     ----------------------------------共勉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章