Java單例設計模式,多執行緒下同步

2021-06-27 21:31:43 字數 2582 閱讀 9699

單例模式的特點:

只建立一次

私有的屬性

公有的訪問方法

單例模式的分類:

懶漢(lazysingleton);預設不自動例項化,等到用的時候根據當前情況例項化,並且返回當前物件;

惡漢(eagersingleton);在類第一次載入的時候強制例項化;

用處:一般用在配置檔案的讀取,有些東西只需要載入一次,以後重複使用。

示例**:

package mythread;  

/**

* 單例模式,懶漢模式

* * @author champion.wong

* */

public class lazysingleton

/**

* 靜態工廠,返回此類的唯一乙個例項 判斷,如果沒有被例項化,則先初始化再返回

* * @return lazysingleton

*/

public static lazysingleton getinstance()

}

package mythread;  

/**

* 單例模式,餓漢模式

* @author champion.wong

* */

public class eagersingleton

public static eagersingleton getinstance()

}

前邊說過了,單例只建立一次,來做個測試,在單例的類中加入乙個屬性,當這個類在例項化的時候,會將當前的時間賦給這個屬性。我們建立兩個單例類的物件,然後分別拿出它們類中的這個屬性進行對比。

所以,在eagersingleton中加入屬性:createdtime

package mythread;  

/**

* 單例模式,餓漢模式

* @author champion.wong

* */

public class eagersingleton

public static eagersingleton getinstance()

private long createdtime = 0l; //此類的建立時間,在類例項化的時候賦值

public long getcreatedtime()

}

然後,寫個test:

package mythread;  

public class test_singleton catch (interruptedexception e)

eagersingleton singleton2 = eagersingleton.getinstance();

system.out.println("singleton1:" + singleton1.getcreatedtime());

system.out.println("singleton2:" + singleton2.getcreatedtime());

} }

最後控制台輸出的內容為:

兩個物件的例項化的時間相同,證明單例設想成功!

當多個執行緒訪問單例類的時候,必須要保證同時只能由乙個執行緒訪問,當這個執行緒訪問結束了,其它執行緒才能訪問。這是就要給單例的訪問方法加個同步鎖(synchronized)。

修改後的lazysingleton為:

package mythread;  

/**

* 單例模式,懶漢模式

* * @author champion.wong

* */

public class lazysingleton

/**

* 靜態工廠,返回此類的唯一乙個例項 判斷,如果沒有被例項化,則先初始化再返回

* * @return lazysingleton

*/

synchronized public static lazysingleton getinstance() catch (interruptedexception e)

return singleton;

} }

做個測試,起兩個執行緒,沒個執行緒中分別呼叫單例類的訪問方法,每次訪問的時候輸出訪問的時間,判斷時間是否相等。如果相等,同步失敗,如果不等,同步成功!

package mythread;  

public class test_thread_singleton

} class singletonthread extends thread catch (interruptedexception e)

singleton = lazysingleton.getinstance();

} }

}

看控制台的輸出內容:

時間差不多都不一致,同步成功!限制了同時訪問。

Java多執行緒20 單例設計模式

單例設計模式 保證類在記憶體中只有乙個物件。如何保證類在記憶體中只有乙個物件?1 控制類的建立,不讓其他類來建立本類的物件。private 2 在本類中定義乙個本類的物件。3 提供公共的訪問方式,例如 public static myobject getinstance 單例寫法兩種 1 餓漢模式。...

Java多執行緒 48 單例設計模式

前面學習了多執行緒的一些知識,這篇來學習並掌握什麼是單例設計模式,以及常見的單例模式寫法有哪些。先來理解什麼是單例模式,單例就是保證類在記憶體中只有乙個物件。我們知道,類是可以通過多種方式去獲取物件,例如常見的new物件。在記憶體中只有乙個物件,如果這句話不好理解。這裡,很多人都用過selenium...

多執行緒 多執行緒 單例設計模式

多執行緒之 單例設計模式 餓漢式 多執行緒安全 1 餓漢式 class single static single getinstance public void show class a implements runnable class test catch interruptedexceptio...