2015-04-05 140 views
1

實習生方法將不斷增加字符串到這是長期的一個壞主意池在Java字符串變量同步process.Exact的情況是這樣的:有沒有一種辦法除了使用實習生方法

// rowKey variable defined below is the value of a row key extracted from a 
// table of the db. There can be many rowKey values. (>100000). 
String rowKey = "rowId_123123"; 
/* Once rowKey is extracted, then if another thread extracts the same 
    row from the table, then it should be put to wait. Object locking will 
    put all the threads to wait irrespective of the rowKey value which will 
    hinder performance. Interning the string will put it into the pool till 
    jvm execution. 
*/ 

有沒有一種方法可以實現這一點,而不需要在字符串中輸入字符串和synchronizing。或者如果有一種方法可以將字符串轉換爲可以被所有線程看到的對象?

+3

我不知道你想什麼,在這裏實現,因爲同步和實習是兩個完全不同的概念。你能解釋你想解決什麼問題嗎? – Keppil 2015-04-05 12:14:27

+0

字符串是不可變的。確切地說,你想如何同步一個? – CandiedOrange 2015-04-05 12:14:44

+0

你如何期待我們猜測你在說什麼? – dasblinkenlight 2015-04-05 12:15:04

回答

0

您可以使用弱引用創建自己的對象實習池,以便使未使用的密鑰過期。

像這樣的東西應該這樣做。我想..:

final class RowLock { 
    public final int rowId; 

    private RowLock(int rowId) { 
     this.rowId = rowId; 
    } 

    public static synchronized RowLock getLockObject(int rowId) { 
     RowLock r = new RowLock(rowId); 
     WeakReference<RowLock> rInternedRef = pool.get(r); 
     if (rInternedRef != null) { 
      RowLock rInterned = rInternedRef.get(); 
      if (rInterned != null) { 
       return rInterned; 
      } 
     } 
     pool.put(r, new WeakReference<>(r)); 
     return r; 
    } 

    private static final WeakHashMap<RowLock,WeakReference<RowLock>> pool = 
     new WeakHashMap<>(); 

    @Override 
    public int hashCode() { 
     return rowId; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return obj == this || (obj instanceof RowLock && ((RowLock)obj).rowId == rowId); 
    } 
} 

如果你的行ID是不是數字,你可以使用一個字符串rowId代替,它會很好的工作。

如果要鎖定一行,請調用getLockObject,然後在返回的對象上進行同步,該對象將通過映射「被攔截」,以便所有線程都將獲得相同的對象。一旦沒有什麼東西會再強烈地指向RowLock實例,它就有資格進行垃圾回收,因爲它的實習池只會引用弱引用。

3

在過去我已經成功使用Guava Striped class這種類型的ObjectLock映射操作。使用弱Striped<Lock>實例從String生成Lock是生成Lock的線程安全方式,可以最大限度地減少內存佔用量,同時最大化併發性。或者,您可以實現自己的Map<Object, Lock>,或許可以混合WeakReference來推出自己功能較少的Striped。無論哪種情況,Striped類都是開始學習如何實現鎖定生成的好地方。這種實現還避免了必須處理String實習的機制和可用性的複雜性和可怕性。

用法示例:

final private static Striped<Lock> locks = Striped.lock(1000); 

...

synchronized(locks.get(rowKey)) { 
相關問題