2009-10-14 68 views

回答

8

當可能有多個線程同時處理同一數據時,需要同步代碼。

代碼是否需要同步並不是您可以通過單元測試發現的東西。當程序是多線程的時候,你必須仔細思考和設計程序以避免問題。

關於Java併發編程的一本好書是Java Concurrency in Practice

+2

+1:設計應該考慮的併發性。你可能不會發現你需要與測試同步的所有地方。相反,你會實現一個系統,傾向於在重負荷下跌倒。 – 2009-10-14 10:10:07

+0

+1表示「不是你可以通過單元測試發現的東西」,儘管你可能通過處理器繁重的測試找到一小部分缺陷。 – 2009-10-14 12:49:52

3

這是一些一般信息的很好來源: http://weblogs.java.net/blog/caroljmcdonald/archive/2009/09/17/some-java-concurrency-tips

當你在用Java多線程環境中,你想要做的並行很多事情,我會建議使用它使用併發隊列的方法(如BlockingQueue或ConcurrentLinkedQueue)實現以及一個簡單的Runnable,該Runnable具有對隊列的引用並且拉取隊列的「消息」。使用ExecutorService來管理任務。排序的一個(非常簡化)演員類型的模型。

因此,儘可能選擇不共享狀態,因爲如果你這樣做,你需要同步,或者使用像ConcurrentHashMap那樣支持併發訪問的數據結構。

3

如果我正確理解你的問題,你想知道你必須同步。不幸的是,沒有提供的鍋爐板代碼顯示了要同步的內容 - 您應該看看可以同時由多個線程訪問的方法和實例變量。如果沒有這樣的話,你通常不需要擔心同步太多。

1

有不可替代的思考關於你的代碼的問題(正如這裏的其他答案所示)。一旦你這樣做了,但是值得在代碼上運行FindBugs。它會識別您在哪裏應用同步不一致,並且對跟蹤難以發現的錯誤很有幫助。

0

是的,所有這些人都是對的 - 沒有其他選擇。但這裏是拇指規則.. 1.如果它的一個閱讀 - 也許你不需要同步 2.如果它的'寫' - 你應該考慮它...

相關問題