2013-05-13 91 views
0

我有一個數據庫對象,它將對象存儲在各種數據結構中。有幾個線程訪問這個數據庫,但是數據庫並不總是最新的。 如果我在一個線程中更改對象的名稱,則更改只會在其他線程中反映,如果他們尚未訪問該對象。 如果我在一個線程中添加一個新項目,所有線程都可以查看此項目。在線程之間共享一個對象的Java

我已經試過聲明數據庫對象的波動,但問題仍然存在,我所有的想法......

謝謝!

編輯:問題是追蹤到我的ObjectOutputStream沒有要求.reset()

+0

這是*數據庫對象*手工處理的緩存?是的,最好使用一個真正的緩存庫,而不是從已經支持多線程的骨灰寫你的。有例如ehcache和infinispan。 – 2013-05-13 22:29:18

+0

這對於一個學校項目,我們不允許使用任何第三方庫。我會盡快給他們看一下,謝謝! – rthur 2013-05-14 08:03:09

回答

1

您需要同步對數據庫的訪問對象實例。

在Java有兩個兩個基本同步成語:

  • 同步方法(應用​​關鍵字來訪問數據庫對象實例的方法)
  • 同步語句(包裹代碼訪問數據庫對象實例在​​區塊內)。

More details

+0

這些線程每個都是作爲構造函數的參數構造的,所以我不能真正同步對數據庫實例的訪問,但數據庫的所有add和get方法都是同步的。 – rthur 2013-05-13 22:24:57

+0

將synchronized關鍵字附加到get和add方法不能解決問題。因爲它可以防止兩個(或多個)線程同時調用add或get方法,但不會阻止一個線程調用get方法,並且在另一個時間調用add方法。在你的情況下,可能需要做的是使用同步語句來同步對用於存儲數據庫數據的數據結構的訪問。 – 2013-05-13 22:29:06

+0

但是,如果您希望我們幫助您,您需要提供您正在使用的代碼。 – 2013-05-13 22:30:31

0

好了,你可以複製的數據是一個新的實例,並在此情況下 像memcached的緩存設計OP。 步: 1.get例如 2.複製實例 3.修改實例 4.使用