C 用多種方式實現Singleton單例模式

2021-07-04 19:09:42 字數 1556 閱讀 6901

題目:設計乙個類,只能生成該類的乙個例項。

(1)解法一:只適用於單執行緒環境

由於要求只能生成乙個例項,因此我們必須把建構函式設為私有函式以禁止他人建立例項。我們可以定義乙個靜態的例項,在需要的時候建立該例項。

public class singleton1

private static singleton1 instance = null;

public static singleton1 funcinstance

return instance;

}}

}

上述**在singleton1的靜態方法funcinstance()中,只有在instance為null的時候才建立乙個例項以避免重複建立,同時把建構函式定義為私有函式,這樣才能確保只建立乙個例項。

(2)解法二:雖然能在多執行緒環境中能工作但是效率不高

解法一中的**在單執行緒的時候工作正常,但是在多執行緒的情況下就有問題了。假設兩個執行緒同時執行到判斷instance是否為null的if語句,並且instance的確沒有建立時,那麼兩個執行緒都會建立乙個例項,此時就不再滿足單例模式的要求了。

public class singleton2

private static readonly object syncobj = new object();

private static singleton2 instance = null;

public static singleton2 funcinstance

}return instance;

}}

}

我們還是假設有兩個執行緒同時想建立乙個例項。由於在乙個時刻只有乙個執行緒能得到同步鎖,當第乙個執行緒加上鎖時,第二個執行緒只能等待。當第乙個執行緒發現例項還沒有建立時,他建立出乙個例項。接著第乙個執行緒釋放同步鎖,此時第二個執行緒可以加上同步鎖,並執行接下來的**。這個時候由於例項已經被第乙個執行緒建立出來了,第二個執行緒就不會重複建立例項了。但是加鎖是乙個比較耗時的操作,我們應該盡量避免。

(3)解法三:加同步鎖前後兩次判斷例項是否已存在

我們只是在例項還沒有建立之前需要加鎖操作,以保證只有乙個執行緒建立出例項。而當例項已經建立之後,就不需要加鎖操作了。**實現如下:

public class singleton3

private static readonly object syncobj = new object();

private static singleton3 instance = null;

public static singleton3 funcinstance}}

return instance;

}}

}

singleton3中只有當instance為null即沒有建立時,需要加鎖操作。當instance已經建立出來後,則無需加鎖。因為只有第一次的時候instance為null,因此只有在第一次試圖建立例項的時候需要加鎖,這樣singleton3的時間效率就比singleton2好。

多種方式實現http服務

在對伺服器實現web服務的時候,面對多個使用者的請求時,我們可以採取多程序或者多執行緒。下面是他們的實現 import urllib.request import multiprocessing import re import socket def service client new socke...

C 的多種繼承方式

繼承的意義在於 可以復用,在原有的基礎上新增新功能就變成了新一代產品了 就像移動 發展史一樣,從大哥大到現在的智慧型手機,代代相傳添磚加瓦,單車變摩托,平房變別墅。究其本質是不變的 繼承也是為了多型服務的。class的繼承分為單繼承,多繼承,菱形繼承,虛擬繼承,菱形虛擬繼承。單繼承 單繼承就是子類d...

C 多種方式連線Oracle。

廢話不多說直接正題 首先我們先在oracle資料庫下建了乙個使用者叫做lisi,密碼為lisi,在這個使用者下建立一張表叫做 users 在這個表下新增三個資料。方式一 利用oledb連線oracle。1 region 使用oledb方式 2 console.writeline oledb方式 3 ...