2015-05-11 45 views
0

這與我之前的問題類似,因爲我仍然不清楚synchronized關鍵字。同步性能

這次我會把它縮短。

private int count = 0; 

synchronized void increment() { 
    count++; 
} 

count是一個實例變量,它在2個線程中共享。

如果線程T1和T2試圖增量次數和OS給T1機會增加數第一: -

T1採用了鎖,原子遞增計數,花時間增量次數是1分鐘(考慮)包括時間來獲得鎖。

但是線程t2呢,它必須等到鎖定釋放。 鎖定釋放後,t2現在增加原子計數,這也需要1分鐘。

所以同步給出的正確性,但它也需要時間來執行。線程是爲了在較少的時間內完成工作,所以爲什麼要在線程中使用同步它有什麼用處。

我的理解是否正確?

+0

你有固定的原子性,但沒有知名度'count'應該是'volatile' –

+1

它的喜歡,你可以使用更多的人來完成在較短的時間了一些工作,但也有少數只有人員可以在給定時間完成的任務(同步修復瞭解關鍵部分的內容)。 –

+2

@NitinDandriyal你可能會想到其他語言。根據JVM規範,在另一個線程中可以看到具有與另一個線程的before-before關係的線程中的動作。並且在同一個監視器上進行同步創建了這種發生之前的關係。訪問相同的易失性變量也可以。 –

回答

1

並非每個線程都必須執行同步作業(否則我們會失去使用線程的要點)。

高效的情形是,線程並獨立工作(例如在一個線程中繪製圖形元素同時播放背景音樂上的另一個)

2

是的,有在使用的同步性能損失。這裏的併發性是保證共享變量讀寫的完整性。在你的情況下,如果沒有同步,t1和t2可能會讀取具有相同值的計數(稱爲1),所以當兩個線程退出時,count的值爲2,即使您應該預期它爲3(因爲它會增加兩次)

1

如果速度不正確,則快速程序無效。

假設您的課程是處理您的帳戶中的資金存款的課程。

假設您的三位客戶要求銀行向您的賬戶存入1000美元。假設銀行不同步存款操作。

,因爲它是不同步的,你可能有一個競爭條件:

  • 所有三個客戶看了你的帳戶的當前餘額並行:0
  • 所有三個客戶增加它:這樣的賬戶餘額變爲$ 1000

結果:您的賬戶不是3000美元,而只有1000美元。但是,這比同步速度快了2毫秒。

您更喜歡這種情況嗎?或者您希望操作額外增加2毫秒,但您的賬戶上有3000美元?

+2

我寧願操作需要2個額外的毫秒並在我的賬戶中有3000美元。 –

+0

@JBNizet我不會介意別人在我的賬戶中轉移6000美元而不是3000美元:) – CKing

0

要添加到@拔示巴的回答,在多個線程共享和訪問這原子變量相同的資源的情況下,你需要確保只有一個線程訪問在給定的時間資源。考慮修改上面下面的例子:

private int count = 0; 

synchronized void increment() { 
    count = count + 1; 
} 

如果使increment()方法​​,然後運行有不一致的狀態的count變量的風險。具體而言,您的兩個線程可能會交錯(這意味着它們都在運行),而一個線程的增量操作可能會被另一個線程覆蓋。

這裏閱讀更多有關同步:https://docs.oracle.com/javase/tutorial/essential/concurrency/interfere.html