Objective c @是否已同步以锁定iVar和/或属性?

Objective c @是否已同步以锁定iVar和/或属性?,objective-c,ios,thread-safety,synchronized,nslock,Objective C,Ios,Thread Safety,Synchronized,Nslock,可能重复: 我有一个问题,关于@synchronized到底做了什么,以及什么对我的应用程序最有利 我有一个NSMutableArray,我将在后台线程中变异,并在前台线程中访问它。如果这意味着我可以从背景突变中获得更新的值,如果我在突变数组内容的同时访问数组,我希望稍微控制一下对数组的访问。但是,我不能100%确定NSLocks和@synchronized是如何工作的 如果不可能,是否可以对数组的副本进行变异,并在完成时,在将属性/实例变量的内容设置为副本的内容时锁定该变量,以便冻结任何访问

可能重复:

我有一个问题,关于
@synchronized
到底做了什么,以及什么对我的应用程序最有利

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

如果不可能,是否可以对数组的副本进行变异,并在完成时,在将属性/实例变量的内容设置为副本的内容时锁定该变量,以便冻结任何访问器调用

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

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

Basically, will the @synchronized(myArray) freeze any accessor calls (have the call hang 
until the lock lets up and then execute)?
否,但如果在调用任何访问器之前,您在阵列实例上使用synchronized指令,则会冻结您的访问器。
如果线程1进入阵列实例上的同步块,而线程2尝试进入同一阵列上的同步块,则必须等待线程1退出该块。但如果在不同对象上使用synchronized指令,则多个线程可以进入同步块

否,但如果在调用任何访问器之前,您在阵列实例上使用synchronized指令,则会冻结您的访问器。

如果线程1进入数组实例上的同步块,而线程2尝试进入同一数组上的同步块,则必须等待线程1退出该块。但是如果在不同的对象上使用synchronized指令,然后多个线程可以进入同步块。

查看Grand Central Dispatch…这是一种更好的多线程数组逻辑方法。@borrden谢谢!这就是我目前处理多重逻辑的方式。希望其他人也能使用它。太棒了。看看Grand Central Dispatch…这是一种更好的多线程数组逻辑方法。@borrden谢谢!这就是我目前处理多重逻辑的方式。希望其他人也能使用它。太好了,好的。谢谢为了线程安全,我不得不想出一种自定义的方法来锁定setter和getter,但它似乎工作得很好。谢谢我建议不要锁定setter/getter,而是锁定调用该方法的块。问题是它来自一个单例,因此,多个类调用setter和getter。然后在使用setter和getter之前在该单例实例上使用synchronized。这不会阻止正常操作。例如,如果在synchronized块之外请求一个只读和不可变属性,这不会导致任何问题。好的。谢谢为了线程安全,我不得不想出一种自定义的方法来锁定setter和getter,但它似乎工作得很好。谢谢我建议不要锁定setter/getter,而是锁定调用该方法的块。问题是它来自一个单例,因此,多个类调用setter和getter。然后在使用setter和getter之前在该单例实例上使用synchronized。这不会阻止正常操作。例如,如果您在synchronized块之外请求一个只读和不可变属性,这不会导致任何问题。