讓物件只能由乙個執行緒呼叫

2021-06-20 09:55:05 字數 1016 閱讀 5643

原來系統中有人寫了乙個鎖住物件的類,他用乙個字典,對每乙個使用者操作,字典中先新增物件的id為key,value為new object。並希望用monitor鎖住obj來實現同步。

我寫了類似的測試**:

public static class mylock

public static void lock(string key)

logmanager.writelog(key);

monitor.enter(_dic[key]);}}

public static void unlock(string key)

}

我覺得這是很差的方法。

第一字典本身就不是執行緒安全的。

第二,使用者登入進來有太多的操作,不能保證所有的操作都用lock()和unlock包起來。

我參考《clr via c#(第3版)》中關於鎖的介紹,修改了該方法,雖然不算完美,但個人認為會比上面的好點。

我給物件加個私有字典private int _waiter = 0;

當某使用者在使用時,把_waiter原子地置為1,這樣來阻塞其他使用者,該使用者離開時把_waiter原子地置為0,阻塞的使用者可以使用了。加了個超時1分鐘。

class user

public string id

private int _waiter = 0;

public void lock()

}public void unlock()

}

而且,這個鎖不應該是靜態的。

很抱歉,我錯了,沒有必要自己寫自旋鎖,然後莫名地等待500毫秒。其實鎖定乙個物件可以通用的用monitor,物件裡定義乙個object就可以了。

private object _obj = new object();

public void lock()

public void unlock()

定義乙個類讓其只能例項化乙個物件

乙個類只例項化出乙個物件稱為單例模式 include class singleclass else private singleclass static int count 靜態成員變數count,不允許在類中初始化。定義為const則可以在這初始化,但是不可更改,不適合在這使用 int singl...

題目 寫乙個只能構造乙個物件的類

題目 寫乙個只能構造乙個物件的類 整理 cmdhack 2010年1 月24日19 47 49 分析 建構函式分為有參構造 無參構造 拷貝構造 三種方法 物件又分為棧中構造物件和堆中構造物件 首先來按照普通的做法寫乙個類如下 很顯然如果單單這樣可以構造無數個物件 那我設想一下如果在建構函式中做乙個 ...

怎麼讓C 程式同時只能執行乙個例項

雙擊乙個winform程式,會開啟乙個介面,也即執行了乙個程式的例項 雙擊多次的時候,會出現多個程式介面。有時候我們需要只允許程式只能同時執行乙個例項。實現方式有很多。一.程序互斥 原理 通過獲取系統程序列表,如果發現有重名的,則表示程式已經執行了,此時新執行的程序就退出 實現 system.dia...