【问题标题】:iOS Objective-c synchronizediOS Objective-c 同步
【发布时间】:2019-02-19 19:06:17
【问题描述】:

在Java中,如果我在方法中有关键字synchronized,它将防止被多个线程同时执行,无论是什么线程:

public synchronized void doSomething() {
  //synchronous code here
}

如果在objective-c中这样做,我会得到相同的结果吗?

-(void)doSomething{
    @synchronized (self) {
       //synchonous code here
    }
}

【问题讨论】:

  • 你真的应该使用 GCD 和专用的串行队列。

标签: ios objective-c multithreading synchronized


【解决方案1】:

是的,有一个警告。

@synchronized 指令创建了一个互斥锁——防止大括号内的代码同时被不同的线程执行。需要注意的是,它使用传递给它的对象作为唯一标识符来区分受保护的块。因此,如果您在两种不同的方法中使用@synchronized(self),则这两种方法将无法被不同的线程同时执行(因为它们共享相同的标识符(在本例中为self))。

【讨论】:

  • 好的,谢谢。就我而言,我有一个写入文件的方法,它是从不同的线程调用的。这个方法在一个在整个系统中使用的实用程序类中,所以如果我在这个方法中使用 @synchonized(self) 就可以了,对吧? Beucase 在这种情况下“自我”将是实用程序类,它在系统中有一个全局实例,对吗?
  • @mrdc 如果您经常从不同的线程写入大量数据,那么该模型的性能将非常糟糕。您可能应该使用串行队列进行写入。此外,您如何保持线程之间的直接写入顺序,或者这有关系吗?在任何情况下,您都可能希望您的线程将要写入的数据组合成不可变的东西,然后将 dispatch_async() 发送到一个串行队列,该队列执行对文件的实际写入。
  • @bbum 谢谢,我读到了 dispatch_async 但在异步操作中我无法控制进程何时发生,所以调用进程很难知道文件是否已经被写入,这对我来说很重要,因为我在完成写入后使用这个文件。在我的测试中,同步运行良好,所以我想我会继续使用它,无论如何我会阅读更多关于 dispatch_async 的内容。
  • 你总是可以在串行队列上扔一个障碍块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多