[英]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.