拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
方法级别的控制没有语言级别的修饰符,可以将代码块加锁。
加锁的方法很多。
@synchronized
NSLock
pthread_mutex
dispatch_semaphore
OSSpinLock
@interface A : NSObject { NSObject _lock; } - (void)func { @synchronized(_lock) { // do something } }
- (void) func { [_lock lock]; // do something [_lock unlock]; }
@interface A : NSObject { pthread_mutex_t lock; } - (instance)init { // 省略 pthread_mutex_init(&_lock, NULL); } - (void)func { pthread_mutex_lock(&lock); // do something pthread_mutex_unlock(&lock); }
@interface A : NSObject { dispatch_semaphore_t _semaphore; } - (instance)init { // 省略 _semaphore = dispatch_semaphore_create(1); } - (void)func { dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER); // do something dispatch_semaphore_signal(_semaphore); }
由于自旋锁在iOS中不再安全,这边也不介绍了,具体可以看这篇博客不再安全的 OSSpinLock
用GCD+block。
方法级别的控制没有语言级别的修饰符,可以将代码块加锁。
加锁的方法很多。
@synchronized
NSLock
pthread_mutex
dispatch_semaphore
OSSpinLock
1. @synchronized
2. NSLock
3. pthread_mutex
4. dispatch_semaphore
5.OSSpinLock
由于自旋锁在iOS中不再安全,这边也不介绍了,具体可以看这篇博客
不再安全的 OSSpinLock
用GCD+block。