簡體   English   中英

Objective C相當於java中的intern()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM