2011-09-08 43 views
2

我得根據字符串實現一些同步算法。我的意思是兩個線程必須同步,並且這對線程都依賴於字符串值(字符串A的一對線程,字符串B的一對線程,等等)。目標C等效於intern()in java

在java中,我可以使用method intern實現算法以獲得由兩個線程共享的單個鎖對象。 Java在jvm內置池中提取所有文件,interne允許將任何動態創建的字符串轉換爲池中的文件。

我明白there is also a pooling mechanism in Objective C

但是,是否有任何與Java intern()等價的方法,即將普通字符串轉換爲字符串常量池中的字符串的方法。爲了獲得對這個唯一字符串的引用,我的兩個線程都可以在同一個對象上同步。

我知道有一些解決辦法,但他們都意味着很多字符串比較,我想避免。 (雖然我相信實習生只是以一種優化的方式...)

用更籠統的術語來解釋我的問題:我想避免有一個將字符串映射到鎖的字典。 Java允許我這樣做,這要感謝實習生,因爲String litteral(合併)將成爲鎖。有什麼等價物或我必須使用這張地圖嗎?

感謝鄉親, 斯特凡

+1

我不認爲這是一個好主意,通過字符串文字進行同步。在字符串變量OK上,但是在字面上,我不知道......但也許我錯了。 –

+2

這可能值得描述你的更高層次的目標是什麼。一般來說,你想達到什麼目的?你的問題聽起來像是你已經有了一個非常具體的解決方案,可以通過Objective-C/Cocoa中的其他方式更好地解決這個問題。 – DarkDust

+0

在最後更新。 – Snicolas

回答

2

我終於使用了一個將每個字符串綁定到一個條件鎖的字典。

感謝所有

2

我在Java和Objective-C編程定期。

首先,你所描述的似乎是一種不太理想的共享鎖的方式。這是棘手的,它很脆弱,它會混淆其他編碼人員與String interning的工作方式不那麼親密。爲什麼不把一個類中的鎖對象作爲常量暴露給另一個呢?

public class Foobar { 

    public static final Object LOCK = new Object(); 

    public void doLockedStuff() { 
     synchronized (LOCK) { 
      // code here 
     } 
    } 

} 

public class Barfoo { 
    public void doLockedStuff() { 
     synchronized (Foobar.LOCK) { 
      // code here 
     } 
    } 
} 

然後你可以在Objective-C中採用類似的方法 - 一個暴露共享LOCK對象的類方法。

+0

我相信任何優秀的解決方案都是非常困難的,只要它有充分的文檔記錄,確實是有效的。 – Snicolas

+0

這種方法與問題無關 – Snicolas

+0

它確實涉及到我認爲使用interned字符串不適合鎖定在Java或Objective-C中。相反,您應該使用專門爲鎖定創建的共享對象。 –

2

我認爲將字符串映射到它們代表的鎖是最好的選擇。

您不想鎖定字符串本身(或實例版本),因爲它是JVM中的共享對象。您不知道JVM中的另一個組件是否正在做同樣的事情,這可能導致死鎖。

Java Concurrency in Practice描述得更好,但目前我找不到參考。

如果您使用HashMap,包含您的鎖的地圖不會產生大的性能問題,因爲字符串是不可變的,並且字符串的哈希碼可能只需計算一次。

2

沒有表明是生成您正在尋找鎖的最好方法,但這裏是一個小黑客給你你想要的效果:

NSString *stringA = [NSString stringWithString:@"Hello"]; 
NSString *stringB = [NSString stringWithFormat:@"%@l%@",@"Hel",@"o"]; 
NSString *stringC = [NSString stringWithFormat:@"Hell%@", @"o"]; 

NSLog(@"%p/%p/%p", stringA, stringB, stringC); 

NSNumber *lockA = [NSNumber numberWithUnsignedInteger:stringA.hash]; 
NSNumber *lockB = [NSNumber numberWithUnsignedInteger:stringB.hash]; 
NSNumber *lockC = [NSNumber numberWithUnsignedInteger:stringC.hash]; 

NSLog(@"%p/%p/%p", lockA, lockB, lockC); 

你會發現儘管這些字符串具有不同的地址,但是它們對應的NSNumber卻沒有。這是因爲給定數字的NSNumbers是單身人士。

您現在可以在這些「鎖定」對象上使用@synchronize()

- 編輯 -

是NSNumbers是給定值單身的事實是內部細節的實現,這是一個原因爲什麼它可能是要貨比三家,對一個真正的鎖定機制是一個好主意例如由NSString索引的字典。

+0

+1最終評論 – Snicolas

+0

兩個字符串可能具有相同的散列 – user102008