Object-C 多線程中鎖的使用-NSLock

在多線程的編程環境中,鎖的使用必不可少!html

因而,今天來總結一下爲共享資源加鎖的操做方法。編程

1、使用synchronized方式多線程

    //線程1async

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{spa

        @synchronized (_myLockObj){.net

            [obj1 method1];線程

            sleep(30);orm

        }htm

        @synchronized (obj1){對象


        

        

        }

    });

    

    //線程2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(1);

        @synchronized (_myLockObj){

            [obj1 method2];

        }

    });

    

}

這樣,就會起到鎖的做用,線程2會等待線程1執行完成@synchronized (obj){}塊後,在執行。從而起到鎖的做用。

2.使用NSLock方式

先貼一個例子:

1. TestObj.h


@interface  TestObj : NSObject

- (void)method1;

- (void)method2;

@end

2. TestObj.m

#import "TestObj.h"


@implementation TestObj


- (void)method1{

    NSLog(@"%@",NSStringFromSelector(_cmd));

    NSLog(@"Current thread = %@", [NSThread currentThread]);

    NSLog(@"Main thread = %@", [NSThread mainThread]);

}


- (void)method2{

    NSLog(@"%@",NSStringFromSelector(_cmd));

    NSLog(@"Current thread = %@", [NSThread currentThread]);

    NSLog(@"Main thread = %@", [NSThread mainThread]);

    

}


@end

3.在須要鎖的視圖控制器中,申明鎖對象。

 TestObj *obj = [[TestObj allocinit];

    NSLock *lock = [[NSLock allocinit];


4.多線程狀態下,鎖操做


 

//線程1

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [lock lock];

        [obj method1];

        sleep(30);

        [lock unlock];

    });

    

    //線程2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(5);//以保證讓線程2的代碼後執行

        [lock lock];

        [obj method2];

        [lock unlock];

    });

5.總結

使用時,基本方法就是:

[lock lock];

[obj yourMethod];

[lock unlock];


咱們稱[obj yourMethod]關鍵部分

NSLock的執行原理:

某個線程A調用lock方法。這樣,NSLock將被上鎖。能夠執行「關鍵部分」,完成後,調用unlock方法。

若是,在線程A 調用unlock方法以前,另外一個線程B調用了同一鎖對象的lock方法。那麼,線程B只有等待。直到線程A調用了unlock。


最後,仍是看看API中對NSLock的一些說明


 

@protocol NSLocking 


 

lock 方法

- (void)lock

得到鎖


unlock 方法

- (void)unlock

釋放鎖


@interface NSLock


lockBeforeDate: 方法

- (BOOL)lockBeforeDate:(NSDate *)limit

在指定的時間之前獲得鎖。YES:在指定時間以前得到了鎖;NO:在指定時間以前沒有得到鎖。

該線程將被阻塞,直到得到了鎖,或者指定時間過時。


tryLock 方法

- (BOOL)tryLock

視圖獲得一個鎖。YES:成功獲得鎖;NO:沒有獲得鎖。


setName: 方法

- (void)setName:(NSString *)newName

爲鎖指定一個Name


name 方法

- (NSString *)name

返回鎖指定的Name



3、使用GCD中dispatch_semaphore_tdispatch_semaphore_wait

TestObj *obj = [[TestObj allocinit];

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

    

    //線程1

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        [obj method1];

        sleep(10);

        dispatch_semaphore_signal(semaphore);

    });

    

    //線程2

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        sleep(1);

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

        [obj method2];

        dispatch_semaphore_signal(semaphore);

    });

關於GCD中dispatch_semaphore_createdispatch_semaphore_wait的使用。請參見個人另外一篇博客:

GCD(Grand Central Dispatch)和Block 使用-淺析

但願對你有所幫助!

相關文章
相關標籤/搜索