2011-09-08 82 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