2012-03-22 38 views
0

在談論Java中的併發性時,我在採訪中被問及以下問題。我無法想出一個好策略。有任何想法嗎?如何在不同步代碼的情況下共享對java資源的訪問?

如何在不同步代碼的情況下共享java中的資源?

+4

將所有訪問限制爲只讀?複製每個用戶的資源?使用原子引用來模擬同步? – maerics 2012-03-22 16:25:30

+0

我想詳細說明你的情況是什麼樣的,你想達到什麼樣的目的最終會幫助你獲得更好/更有幫助的答案 – posdef 2012-03-22 16:32:23

回答

7

如果資源是不可變的則不需要進行同步,但除此之外,這裏有一些想法:

  1. 限制所有存取只讀:如果不更新資源,那麼任何數量的併發線程可以安全地看了訪問它。

  2. 複製每位訂閱者的資源:任何數量的線程都可以擁有自己的資源副本並安全地對其進行修改,而不會影響其他擁有自己副本的線程。 (例如ThreadLocal

  3. 使用的原子參考模擬同步:一個「吸氣劑」的方法使用檢查原子參考(例如AtomicBoolean)來創建一個「檢查」 /「簽出」系統,以確保只有一個線程可以訪問資源,不需要同步。

  4. java.util.concurrent.locks使用鎖:其可提供相同的(或者甚至更好的)功能,而無需使用​​關鍵字。

當然,面試官可能會施加額外的限制,但考慮到您的問題中的信息很少,這些都是很好的起點。

1

這要看情況,如果有可能,但隨之而來的腦海裏: 充分利用共享資源不可變,或使共享資源無國籍

0

如果使用volatile關鍵字不被認爲是「同步代碼」,那麼它可能有助於某些情況。那麼如何使用像ConcurrentHashMap或Vector一樣同步的集合類呢?

相關問題