synchronized 詳解

關(guān)于synchronized

問題:
1、鎖是如何和與你傳入的@synchronized的對(duì)象關(guān)聯(lián)上的?
2、@synchronized 會(huì)保持(retain, 增加引用計(jì)數(shù))被鎖住的對(duì)象嗎?
3、假如你傳入@synchronized的對(duì)象在@synchronized的block里面被釋放或者被賦值為nil 將會(huì)怎么樣?

#偽代碼:
@synchronized(obj) {
    // do work
}

@try {
    objc_sync_enter(obj);
    // do work
} @finally {
    objc_sync_exit(obj);
}

#使用到的數(shù)據(jù)結(jié)構(gòu)
typedef struct SyncData {
    id object;
    recursive_mutex_t mutex;
    struct SyncData* nextData;
    int threadCount;
} SyncData;

typedef struct SyncList {
    SyncData *data;
    spinlock_t lock;
} SyncList;

// Use multiple parallel lists to decrease contention among unrelated objects.
#define COUNT 16
#define HASH(obj) ((((uintptr_t)(obj)) >> 5) & (COUNT - 1))
#define LOCK_FOR_OBJ(obj) sDataLists[HASH(obj)].lock
#define LIST_FOR_OBJ(obj) sDataLists[HASH(obj)].data
static SyncList sDataLists[COUNT];

當(dāng)你調(diào)用 objc_sync_enter(obj) 時(shí),它用 obj 內(nèi)存地址的哈希值查找合適的 SyncData,然后將其上鎖。當(dāng)你調(diào)用 objc_sync_exit(obj) 時(shí),它查找合適的 SyncData 并將其解鎖。

objc_sync_enter 源碼
int objc_sync_enter(id obj)
{
    int result = OBJC_SYNC_SUCCESS;

    if (obj) {
        SyncData* data = id2data(obj, ACQUIRE);
        require_action_string(data != NULL, done, result = OBJC_SYNC_NOT_INITIALIZED, "id2data failed");
    
        result = recursive_mutex_lock(&data->mutex);
        require_noerr_string(result, done, "mutex_lock failed");
    } else {
        // @synchronized(nil) does nothing
        if (DebugNilSync) {
            _objc_inform("NIL SYNC DEBUG: @synchronized(nil); set a breakpoint on objc_sync_nil to debug");
        }
        objc_sync_nil();
    }

done: 
    return result;
}

回答:
1、你調(diào)用synchronized 的每個(gè)對(duì)象,OC runtime都會(huì)為其分配一個(gè)遞歸鎖并存在哈希表中。
2、如果在synchronized 內(nèi)部對(duì)象被釋放或被設(shè)為nil,看起來都OK。
3、注意不要向你的 synchronized block 傳nil,這將會(huì)從代碼中移走線程安全

synchronized 詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容