2011-12-16 49 views
0

我有一個上下文類。所以我創建了一個類的實例。由於這門課執行困難和昂貴的數學運算,我不想每次都這樣做。所以我正在緩存課程。如何獲得make線程類實例,如果它們被下一次緩存

如果當我創建一個新實例時該怎麼辦?如果另一個線程到來並從緩存中獲取相同的實例呢?

有沒有解決這個問題的方法......?

+0

到目前爲止,我沒有看到問題。你看到什麼問題? – 2011-12-16 13:56:55

回答

0

既然你還沒有提到任何代碼,最簡單的建議是讓你的課Immutable。這意味着類的狀態一旦初始化就不能改變。要求您發佈一些樣品/代表性代碼。

0

取決於緩存實施。高度依賴於你可以控制哪些部分。

0

我相信你是在談論保護你的緩存從race conditions。當兩個或更多線程同時訪問共享資源(在這種情況下爲緩存)時沒有適當的保護,競爭條件就會發生。

有很多方法可以保護您的緩存避免不正確的多線程訪問。沒有細節或向我們展示一些代碼,很難具體,但考慮以下一些技術。

  1. 使用過程中的​​關鍵字可以幫助保護緩存從比賽條件。將緩存中的實例添加到緩存中的線程將在緩存中進行同步。從緩存獲取實例的線程也會同步。

  2. 如果您的課程實例一次只能由一個線程使用,那麼您可以使用尺寸爲1的BlockingQueue。您的類的實例可以添加到隊列中,線程將等待直到獲取實例。完成後,它會將其放回BlockingQueue,讓下一個線程獲得課程。

  3. 確保類的實例在放入緩存時已完全初始化。

如果您編輯您的問題,並提供代碼示例或更多詳細信息,我們可以幫助您更好。

0

您可以創建一個thread-local緩存,以避免與不同的線程共享的高速緩存的實例:

class CostyThingCache { 

    static ThreadLocal<CostyClass> cache = new ThreadLocal<CostyClass>() { 

     // This gets called once ever per thread: 
     @Override 
     protected CostyClass initialValue() { 
      return new CostyClass(); 
     } 

    }; 

    static CostyClass getCostyThing() { 
     return cache.get(); 
    } 

} 

另外,序列化(同步)​​訪問costy對象,只創建其中之一。哪種替代方案更好取決於你實際做了什麼。