使用同步 - 1

“嗨,阿米戈!”

“是的,我來了,我來了。”

“今天,我將告訴你如何在實踐中使用synchronized。”

“當一個程序有很多對象和線程時,經常會發生多個線程同時處理同一個對象的情況。這樣做時,線程會相互干擾。”

“是的,我已經知道了。”

“所以,假設你有一個對像被多個線程訪問。你可以做兩件事來避免問題。”

“第一種是使用同步塊來包裝訪問對象的每個位置。但如果某些程序員編寫直接訪問對象的代碼,而不使用同步塊,則這種方法可能行不通。”

“因此,大多數時候使用第二種方法——使對象線程安全。” “換句話說,同步機制內置於對象本身:它聲明其方法是同步的和/或將代碼包裝在其方法中的同步塊中。”

“所以我可能從多個線程使用的任何對象,這幾乎是程序中的所有對象,我必須確保線程安全?”

“一般來說,是的。實際上,並非程序中的所有對像都被不同的線程使用,但通常有很多。因此,當您開始為線程編寫代碼並從中訪問各種對象時,然後在每次方法調用時你應該問問自己,«這個電話安全嗎?»”

“安全的?”

“線程安全的,這意味著它可以從多個線程安全地調用。”

“這裡有一些例子。假設你有一個從不同線程訪問的 String 對象。正如你應該記住的那樣,String 是不可變的——就像所有其他基本類型一樣。這意味著一個對像在創建後不會改變.這意味著不可能“破壞”這樣的對象。所有不可變對像都是線程安全的。

“嗯,這樣事情就簡單多了。”

“現在,假設你需要一個可變字符串。”

“嗯,我記得了。這樣的字符串有兩種:StringBuffer和StringBuilder。StringBuffer和StringBuilder一樣,但是它的所有方法都是同步的,它也是線程安全的嗎?”

“是的。如果你需要從多個線程訪問一個 StringBuilder 對象,你必須用一個 StringBuffer 替換它。否則,遲早這些線程會同時更改它並“破壞”它。”

“如果從不同線程訪問的對像是我自己類的對象怎麼辦?在這種情況下我是否也需要將同步添加到它的方法中?”

“是的。最好遵循這個規則:所有將從不同線程訪問的對像都必須是線程安全的。”

“我明白了。我沒想到一切都這麼嚴重。謝謝,艾莉。”

“不客氣。我希望當 Diego 給你一些他的簡單任務時,這些提示會對你有所幫助。☺”