编译器翻译@synchronized(objToBeSync) { ... }
成
callq _objc_sync_enter
...
callq _objc_sync_exit
而从
Objective-C Runtime Source Code (objc-sync.mm, objc-os.mm, objc-lockdebug.mm, objc-os.h) 可以看出这些函数主要做了一个
pthread_mutex_lock(m->mutex);
...
pthread_mutex_unlock(m->mutex);
其中m->mutex
apthread_mutex_t
具有PTHREAD_MUTEX_RECURSIVE
与 object 关联的属性objToBeSync
,使用运行时内部的缓存。
因此,您的问题的直接答案是:不,没有公共 API 可以获取对象的“锁定”状态,并且访问内部互斥锁对我来说几乎是不可能的。
因此,如果您有此要求,您应该使用不同的锁定机制,例如 Posix 互斥锁NSLock
或NSRecursiveLock
. 所有这些锁都有一个“try”方法,可以用来获取锁,或者立即失败而不阻塞。
有关概述,请参阅
“线程编程指南:同步” 。
请注意@synchronized
(与其他锁定机制相比)隐式将异常处理程序添加到块中,以便在抛出异常时释放互斥锁。
同样@synchronized
是递归锁,即同一个线程可以不阻塞地进入受保护的代码。如果这与您的代码相关,您将不得不使用
NSRecursiveLock
或带有“递归”属性的 Posix Mutex Lock。
请注意,_isBeingSync
为此目的使用简单的实例变量会受到竞争条件的影响,并且不会安全地工作。