簡體   English   中英

我在哪里放置同步

[英]Where do i put the synchronization

可以說我有一個處理共享變量的方法。 由於該方法的復雜性,需要將其一部分封裝到另一種方法中。

所以我們有這樣的事情:

private void methodA()
{
    //do something...
    //do something else...

    synchronized(shared_variable)
    {
        //do something...
        methodB(shared_variable);
        //.....
        //.....
    } 
}

現在我想知道的是我是否應該在methodB中同步shared_variable。 實際上,我知道這不是必需的,但是這段代碼聞起來很不好。

任何解決方案如何在這種情況下正確地做事?

聚苯乙烯

我問的原因是因為以后在開發過程中methodB可能在methodA之外被稱為。 因此,如果我不將同步放在methodB中的shared_variable上,它將不會是線程安全的。 但是,當我從方法A調用方法B時,我已經鎖定了shared_variable兩次,因此對我來說似乎有點奇怪。

通過聲明synchronized(shared_variable) ,實際上是在shared_variable上聲明了一個監視器,這意味着每當線程進入同步塊時,它都會獲取給定對象的鎖。 從理論上講,沒有其他線程能夠實現監視,直到它被初始線程釋放為止,這是在它完成同步塊的執行(包括methodB的執行)時發生的。

如果這樣做,則在synchronized范圍內,其他線程將等待它退出范圍。 工作方式; 如果沒有同步,則如果一個線程嘗試訪問shared_variable並被另一線程使用,則嘗試訪問它的線程基本上可以通過它而不看到更新。 因此,如果同步它,則在更改線程完成之前,不允許訪問線程讀取它。 雖然,更改它的線程有時實際上可以比讀取它的線程更快地對其進行更改,從而完全沒有速度損失。

因此,如果這是您需要的,請按照這種方式進行。 否則,如果您不需要精確的shared_variable,則可以犧牲它以提高速度。 並且不同步它。

編輯:如果您再次在同一對象的同步塊內同步同一對象,這很好,因為被鎖定的對象已經在鎖內。 它將通過。

暫無
暫無

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

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