iOS多線程中鎖??應(yīng)用的總結(jié)

[TOC]

一. 最簡(jiǎn)單的NSLock

@interface LiLockController ()
@property(nonatomic,strong)NSLock * lock;
@end

@implementation LiLockController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.lock = [[NSLock alloc]init];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self.lock lock];
        for (int i = 0; i < 10; i ++) {
            NSLog(@"------1111111111------");
        }
        [self.lock unlock];
    });
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self.lock lock];
        for (int i = 0; i < 10; i ++) {
            NSLog(@"++++++22222222+++++++");
        }
        [self.lock unlock];
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self.lock lock];
        for (int i = 0; i < 10; i ++) {
            NSLog(@"*******33333333*******");
        }
        [self.lock unlock];
    });
}
@end

二.NSCondition : NSObject <NSLocking>

條件鎖 滿足某個(gè)條件下才能執(zhí)行某個(gè)操作

@interface LiLockController ()
@property(nonatomic,strong)NSCondition * conditionLock;
@property(nonatomic,strong)NSMutableArray * dataSource;
@end

@implementation LiLockController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.conditionLock = [[NSCondition alloc]init];
    self.dataSource    = [NSMutableArray array];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
        [self.conditionLock lock];
        if (self.dataSource.count == 0) {
            [self.conditionLock wait];
        }
        [self.dataSource addObject:@"999"];
        NSLog(@"第二個(gè)網(wǎng)絡(luò)請(qǐng)求");
        [self.conditionLock signal];
        [self.conditionLock unlock];
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        if (self.dataSource.count < 2) {
            [self.conditionLock wait];
        }
        NSLog(@"第三個(gè)網(wǎng)絡(luò)請(qǐng)求");
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self.conditionLock lock];
        [self.dataSource addObject:@"888"];
        NSLog(@"第一個(gè)網(wǎng)絡(luò)請(qǐng)求");
        [self.conditionLock signal];
        [self.conditionLock unlock];
    });
    
}

三.串行隊(duì)列

 dispatch_queue_t queue = dispatch_queue_create("Queue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"------1111111111------");
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"++++++22222222+++++++");
        }
    });
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"*******33333333*******");
        }
    });

四.信號(hào)量

@interface LiLockController ()
@property (nonatomic,strong)dispatch_semaphore_t semaphore;
@end

@implementation LiLockController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.semaphore = dispatch_semaphore_create(1);//只允許一條線程訪問
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        for (int i = 0; i < 10; i ++) {
            NSLog(@"------1111111111------");
        }
        dispatch_semaphore_signal(self.semaphore);
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        for (int i = 0; i < 10; i ++) {
            NSLog(@"++++++22222222+++++++");
        }
        dispatch_semaphore_signal(self.semaphore);
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        for (int i = 0; i < 10; i ++) {
            NSLog(@"*******33333333*******");
        }
        dispatch_semaphore_signal(self.semaphore);
    });
    
}

五.@synchronized

- (void)viewDidLoad {
    [super viewDidLoad];

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        @synchronized (self) {
            for (int i = 0; i < 10; i ++) {
                NSLog(@"------1111111111------");
            }
        }
        
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        @synchronized (self) {
            for (int i = 0; i < 10; i ++) {
                NSLog(@"++++++22222222+++++++");
            }
        }
        
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        @synchronized (self) {
            for (int i = 0; i < 10; i ++) {
                NSLog(@"*******33333333*******");
            }
        }
        
    });
    
}
*****************************************************************
遞歸鎖??
- (void)otherTest
{
    @synchronized(self) {
        NSLog(@"123");
        [self otherTest];
    }
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self otherTest];
}

六.GCD柵欄函數(shù)實(shí)現(xiàn)多讀單寫

@interface LiLockController ()
@end

@implementation LiLockController

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_queue_create("rw_Queue", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i < 10; i++) {
        dispatch_async(queue, ^{
            [self read];
        });
        
        dispatch_async(queue, ^{
            [self read];
        });
        
        dispatch_async(queue, ^{
            [self read];
        });
        
        dispatch_barrier_async(queue, ^{
            [self write];
        });
    }
    
}
- (void)read
{
    NSLog(@"---讀---");
}
- (void)write
{
    NSLog(@"***寫***");
}
@end
最后編輯于
?著作權(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)容