簡體   English   中英

為什么鎖對象必須是靜態的?

[英]Why does the lock object have to be static?

在多線程中使用私有靜態只讀對象進行鎖定是很常見的。 我知道私有通過收緊封裝減少了鎖定對象的入口點,因此可以訪問最重要的部分。

但為什么是靜態的?

private static readonly object Locker = new object();

最后,該字段僅在我的班級中使用,我也可以只使用它:

private readonly object Locker = new object();

任何意見?

更新:

作為一個例子,我已經粘貼了這段代碼(只是一個例子)。 我可以在上面使用靜態或非靜態儲物櫃,兩者都可以正常工作。 考慮到下面的答案,我應該像這樣定義我的儲物櫃嗎?

private readonly object Locker = new object();

這是代碼:

    private int _priceA;
    private int _priceB;
    private EventWaitHandle[] _waithandle;
    private readonly IService _service;

//ctor
public ModuleAViewModel(IService service)
    {
        _service = service;
        _modelA = new ModelA();
        _waithandle = new ManualResetEvent[2];
        _waithandle[0] = new ManualResetEvent(false);
        _waithandle[1] = new ManualResetEvent(false);
        LoadDataByThread();
    }


 private void LoadDataByThread()
        {
            new Thread(() =>
                           {
                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceA = _service.GetPriceA();
                                   }
                                   _waithandle[0].Set();
                               }).Start();

                               new Thread(() =>
                               {
                                   lock (Locker)
                                   {
                                       _priceB = _service.GetPriceB();
                                   }
                                   _waithandle[1].Set();
                               }).Start();

                               WaitHandle.WaitAll(_waithandle);
                               PriceA = _priceA;
                               PriceB = _priceB;
                           }).Start();
        }

謝謝

“在多線程中使用私有靜態只讀對象進行鎖定並不常見”——相反,在適當/選擇的粒度上使用鎖是很常見的。 有時那是static的。 更常見的是,IMO 不是——而是基於實例的。

您看到static鎖的主要時間是全局緩存,或全局數據/單例的延遲加載。 在后者中,無論如何都有更好的方法。

所以這真的取決於: Locker在你的場景中是如何使用的? 它是在保護本身是靜態的東西嗎? 如果是這樣,鎖應該是靜態的。 如果它正在保護基於實例的東西,那么 IMO 鎖應該是基於實例的。

它不必是靜態的,實際上有時它應該是靜態的。

該變量應與您使用它進行鎖定的方法位於同一范圍內。 如果方法是靜態的,則變量應該是靜態的,如果方法是實例方法,則變量應該是實例變量。

當用於鎖定實例方法時,靜態變量仍然可以工作,但是您將鎖定太多。 您將鎖定所有實例中的所有方法,而不僅僅是同一實例中的方法。

鎖的范圍和生命周期可以/應該取決於您要鎖定的“事物”。 靜態鎖主要用於鎖定靜態的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM