怪我咯2017-04-18 09:24:15
Method-level control has no language-level modifiers, and code blocks can be locked.
There are many ways to lock.
@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);
}
Since spin lock is no longer safe in iOS, it will not be introduced here. For details, you can read this blog
OSSpinLock is no longer safe