【问题标题】:@synchronized to lock iVar and/or property? [duplicate]@synchronized 锁定 iVar 和/或属性? [复制]
【发布时间】:2012-11-30 18:39:14
【问题描述】:

可能重复:
What does @synchronized() do?

我有一个关于 @synchronized 的真正作用以及最适合我的应用程序的问题。

我有一个NSMutableArray,我将在后台线程中进行变异并在前台线程中访问。如果我在改变它的内容时访问数组,我希望对访问数组有一点控制,如果这意味着我可以从背景突变中获取更新的值。但是,我不能 100% 确定 NSLocks 和 @synchronized 具体是如何工作的。

如果不可能,是否可以改变数组的副本,完成后,在设置副本的内容时锁定属性/实例变量,以冻结任何访问器调用?

基本上,@synchronized(myArray) 会冻结任何访问器调用(让调用挂起,直到锁释放然后执行)?

另外,是否可以使用 NSLock 锁定实例变量或属性?从我所见,它似乎只锁定代码块。

【问题讨论】:

  • 查看 Grand Central Dispatch...这是执行多线程数组逻辑的更好方法。
  • @borrrden 谢谢!这实际上就是我目前处理多线程逻辑的方式。希望其他人也能看到使用它。它很棒。

标签: objective-c ios thread-safety synchronized nslock


【解决方案1】:
Basically, will the @synchronized(myArray) freeze any accessor calls (have the call hang 
until the lock lets up and then execute)?

不,但如果在调用任何访问器之前,您在数组实例上使用同步指令,它将冻结您的访问器。
如果线程 1 进入数组实例上的同步块,并且线程 2 尝试进入同一数组上的同步块,它必须等待线程 1 从块中退出。但是如果您使用同步指令不同的对象,那么多个线程可以进入同步块。

【讨论】:

  • 好的。谢谢!为了线程安全,我不得不想出一种自定义方法来锁定 setter 和 getter,但它似乎工作得很好。谢谢!
  • 我建议不要锁定setter/getter,而是锁定调用方法的块。
  • 问题是它来自单例,所以多个类调用setter和getter。
  • 然后在使用 setter 和 getter 之前在该单例实例上使用 synchronized。这不会阻止正常操作。例如,如果您在同步块之外请求只读和不可变属性,这不会导致任何问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2012-06-23
  • 2012-11-23
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多