双重检查锁定 - Objective-C

5
我意识到在Java中,双重锁定由于内存模型存在缺陷,但通常与单例模式和优化单例创建相关联。
那么在Objective-C下呢?我有一个布尔标志来确定我的应用程序是否正在流数据。我有3个方法:startStreaming、stopStreaming、streamingDataReceived,并且我使用以下方式来保护它们免受多个线程的干扰:
- (void) streamingDataReceived:(StreamingData *)streamingData {
    if (self.isStreaming) {
        @synchronized(self) {
            if (self.isStreaming) {

- (void) stopStreaming {
    if (self.isStreaming) {
        @synchronized(self) {
            if (self.isStreaming) {

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
    if (!self.isStreaming) {
        @synchronized(self) {
            if (!self.isStreaming) {

这个双重检查是否必要?在Objective-C中,双重检查是否存在与Java类似的问题?有哪些替代模式(反模式)可供选择。

谢谢

2个回答

2

这同样存在缺陷 - 你会遇到竞态条件

你需要进入同步块,然后再检查标志位


您可以扩展答案,添加替代建议。例如,在Objective-C中是否有类似于“transient”或AtomicInteger / etc的等效物? - Jon Tirsen

0

在我看来,那似乎是过早的优化。有什么问题吗(例如)

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
        @synchronized(self) {
            if (!self.isStreaming) {
...

如果不必要的话,我会避免进入同步块的成本。 - bandejapaisa
这就是我所说的“过早优化”。除非你用分析器测量过进入同步块的成本并且它占用了大量时间,否则你为什么要关心它呢? - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接