2012-12-12 32 views
1

可能重复:
What does @synchronized() do?@synchronized锁定iVar和/或财产?

我有什么@synchronized确实,什么将是最适合我的应用程序的问题。

我有一个NSMutableArray,我将在后台线程中进行变异并在前台线程中进行访问。如果在我改变它的内容的时候访问数组,如果它意味着我可以从背景突变中获取更新后的值,我很乐意轻松地访问数组。然而,我不能100%确定NSLock s和@synchronized是如何工作的。

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

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

此外,是否有可能锁定实例变量或属性与NSLock?从我所看到的,它似乎只锁定代码块。

+1

调查Grand Central Dispatch ...这是一种更好的方式来执行多线程阵列逻辑。 – borrrden

+0

@borrrden谢谢!这实际上是我目前如何处理多层逻辑。希望其他人也可以看到使用它。这很棒。 – RileyE

回答

1
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块。

+0

好的。谢谢!为了线程安全,我不得不想出一种锁定setter和getters的自定义方式,但它似乎工作得很好。谢谢! – RileyE

+0

我建议不要锁定setter/getter,而是要锁定调用该方法的块。 –

+0

问题在于它来自单例,所以多个类调用setters和getters。 – RileyE