[英]Objective C equivalent of intern() in java
我必須根據字符串實現一些同步算法。 我的意思是必須同步兩個線程,並且這對線程都依賴於字符串值(字符串A的一對線程,字符串B的一對線程,依此類推)。
在java中,我可以使用方法實現來實現算法,以獲得由兩個線程共享的單個鎖對象。 Java在jvm內置池中提取所有內容,並且interne允許將動態創建的任何字符串轉換為池中的litteral。
我知道目標C中還有一個池化機制 。
但是在Java中是否存在與intern()的等價物,即從String常量池中將普通String轉換為litteral String的方法。 獲取對這個唯一的String postteral的引用,以便我的兩個線程可以在同一個對象上進行同步。
我知道有一些工作,但它們都暗示了我想避免的很多字符串比較。 (雖然我相信實習生是以優化的方式做到的......)
用更一般的術語來解釋我的問題:我想避免使用將字符串映射到鎖的字典。 Java允許我這樣做,這要歸功於實習生,因為String litteral(pooled)將成為鎖定。 有沒有等價物或者我必須使用這張地圖。
謝謝大家,Stéphane
我經常在Java和Objective-C中編程。
首先,您描述的內容似乎是一種不太理想的共享鎖定方式。 它很棘手,很脆弱,而且會讓其他編碼人員對String實習的工作方式感到困惑。 為什么不將一個類中的鎖定對象作為常量暴露給另一個類?
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對象的類方法。
我認為將字符串映射到它們代表的鎖是最好的選擇。
您不希望鎖定String本身(或實例版本),因為它是JVM中的共享對象。 您不知道JVM中的另一個組件是否正在執行相同的操作,這可能會導致死鎖。
Java Concurrency in Practice更好地描述了這一點,但我目前找不到引用。
如果使用HashMap,包含鎖的映射不會產生大的性能問題,因為字符串是不可變的,並且字符串的哈希碼可能只需要計算一次。
我終於使用了一個字典,它將每個字符串綁定到一個條件鎖。
謝謝大家
沒有暗示這是生成你正在尋找的鎖的最佳方法,但這里有一點點黑客可以給你想要的效果:
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索引的字典)的一個原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.