- (void)synchronized {
NSObject *dwobj = [NSObject new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@synchronized(dwobj) {
NSLog(@"线程1开始");
sleep(3);
NSLog(@"线程1结束");
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
@synchronized(dwobj){
NSLog(@"线程2");
}
});
}
线程1开始
线程1结束
线程2
@protocol NSLocking
- (void)lock;
- (void)unlock;
@end
@interface NSLock : NSObject <NSLocking> {
@private
void *_priv;
}
- (BOOL)tryLock;
- (BOOL)lockBeforeDate:(NSDate *)limit;
@property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@end
NSLock *dwlock = [NSLock new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[dwlock lock];
NSLog(@"线程1加锁成功");
sleep(2);
[dwlock unlock];
NSLog(@"线程1解锁成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
[dwlock lock];
NSLog(@"线程2加锁成功");
[dwlock unlock];
NSLog(@"线程2解锁成功");
});
// 运行程序,结果如下
线程1加锁成功
线程1解锁成功
线程2加锁成功
线程2解锁成功
NSLock *dwlock = [NSLock new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[dwlock lock];
NSLog(@"线程1加锁成功");
sleep(2);
[dwlock unlock];
NSLog(@"线程1解锁成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([dwlock tryLock]) {
NSLog(@"线程3加锁成功");
[dwlock unlock];
NSLog(@"线程3解锁成功");
} else {
NSLog(@"线程3加锁失败");
}
});
// 运行程序,结果如下
线程1加锁成功
线程3加锁失败
线程1解锁成功
NSLock *dwlock = [NSLock new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[dwlock lock];
NSLog(@"线程1加锁成功");
sleep(2);
[dwlock unlock];
NSLog(@"线程1解锁成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(3);
if ([dwlock tryLock]) {
NSLog(@"线程4加锁成功");
[dwlock unlock];
NSLog(@"线程4解锁成功");
} else {
NSLog(@"线程4加锁失败");
}
});
// 运行程序,结果如下
线程1加锁成功
线程1解锁成功
线程4加锁成功
线程4解锁成功
NSLock *dwlock = [NSLock new];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[dwlock lock];
NSLog(@"线程1加锁成功");
sleep(2);
[dwlock unlock];
NSLog(@"线程1解锁成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([dwlock lockBeforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]) {
NSLog(@"线程5加锁成功");
[dwlock unlock];
NSLog(@"线程5解锁成功");
} else {
NSLog(@"线程5加锁失败");
}
});
// 运行程序,结果如下
线程1加锁成功
线程1解锁成功
线程5加锁成功
线程5解锁成功
pthread_mutex_init(pthread_mutex_t *restrict _Nonnull, const pthread_mutexattr_t *restrict _Nullable);
pthread_mutex_lock(pthread_mutex_t * _Nonnull);
pthread_mutex_trylock(pthread_mutex_t * _Nonnull);
pthread_mutex_unlock(pthread_mutex_t * _Nonnull);
pthread_mutex_destroy(pthread_mutex_t * _Nonnull);
__block pthread_mutex_t dwlock;
pthread_mutex_init(&dwlock, NULL);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
pthread_mutex_lock(&dwlock);
NSLog(@"线程1开始");
sleep(3);
NSLog(@"线程1结束");
pthread_mutex_unlock(&dwlock);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
pthread_mutex_lock(&dwlock);
NSLog(@"线程2");
pthread_mutex_unlock(&dwlock);
});
// 运行程序,结果如下:
线程1开始
线程1结束
线程2
typedef int32_t OSSpinLock;
// 加锁
void OSSpinLockLock( volatile OSSpinLock *__lock );
// 尝试加锁
bool OSSpinLockTry( volatile OSSpinLock *__lock );
// 解锁
void OSSpinLockUnlock( volatile OSSpinLock *__lock );
#import <libkern/OSAtomic.h>
__block OSSpinLock theLock = OS_SPINLOCK_INIT;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSSpinLockLock(&theLock);
NSLog(@"线程1开始");
sleep(3);
NSLog(@"线程1结束");
OSSpinLockUnlock(&theLock);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSSpinLockLock(&theLock);
sleep(1);
NSLog(@"线程2");
OSSpinLockUnlock(&theLock);
});
//运行程序,结果如下:
线程1开始
线程1结束
线程2
// 初始化
os_unfair_lock_t unfairLock = &(OS_UNFAIR_LOCK_INIT);
// 加锁
os_unfair_lock_lock(unfairLock);
// 尝试加锁
BOOL b = os_unfair_lock_trylock(unfairLock);
// 解锁
os_unfair_lock_unlock(unfairLock);
@interface NSConditionLock : NSObject <NSLocking> {
@private
void *_priv;
}
- (instancetype)initWithCondition:(NSInteger)condition NS_DESIGNATED_INITIALIZER;
@property (readonly) NSInteger condition;
- (void)lockWhenCondition:(NSInteger)condition;
- (BOOL)tryLock;
- (BOOL)tryLockWhenCondition:(NSInteger)condition;
- (void)unlockWithCondition:(NSInteger)condition;
- (BOOL)lockBeforeDate:(NSDate *)limit;
- (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit;
@property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@end
NSConditionLock *dwlock = [[NSConditionLock alloc] initWithCondition:0];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[dwlock lock];
NSLog(@"线程1加锁成功");
sleep(1);
[dwlock unlock];
NSLog(@"线程1解锁成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
[dwlock lockWhenCondition:1];
NSLog(@"线程2加锁成功");
[dwlock unlock];
NSLog(@"线程2解锁成功");
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(2);
if ([dwlock tryLockWhenCondition:0]) {
NSLog(@"线程3加锁成功");
sleep(2);
[dwlock unlockWithCondition:2];
NSLog(@"线程3解锁成功");
} else {
NSLog(@"线程3尝试加锁失败");
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if ([dwlock lockWhenCondition:2 beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]) {
NSLog(@"线程4加锁成功");
[dwlock unlockWithCondition:1];
NSLog(@"线程4解锁成功");
} else {
NSLog(@"线程4尝试加锁失败");
}
});
// 运行程序,结果如下
线程1加锁成功
线程1解锁成功
线程3加锁成功
线程3解锁成功
线程4加锁成功
线程4解锁成功
线程2加锁成功
线程2解锁成功
@interface NSCondition : NSObject <NSLocking> {
@private
void *_priv;
}
- (void)wait; // 挂起线程
- (BOOL)waitUntilDate:(NSDate *)limit; // 什么时候挂起线程
- (void)signal; // 唤醒一条挂起线程
- (void)broadcast; // 唤醒所有挂起线程
@property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@end
NSCondition *dwCondition = [NSCondition new];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[dwCondition lock];
NSLog(@"线程1线程加锁");
[dwCondition wait];
NSLog(@"线程1线程唤醒");
[dwCondition unlock];
NSLog(@"线程1线程解锁");
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[dwCondition lock];
NSLog(@"线程2线程加锁");
if ([dwCondition waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]]) {
NSLog(@"线程2线程唤醒");
[dwCondition unlock];
NSLog(@"线程2线程解锁");
}
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
[dwCondition signal];
});
// 运行程序,结果如下:
线程1线程加锁
线程2线程加锁
线程1线程唤醒
线程1线程解锁
// 如果 [dwCondition signal]; 改成 [dwCondition broadcast];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
sleep(2);
[dwCondition broadcast];
});
// 运行程序,结果如下:
线程1线程加锁
线程2线程加锁
线程1线程唤醒
线程1线程解锁
线程2线程唤醒
线程2线程解锁
@interface NSRecursiveLock : NSObject <NSLocking> {
@private
void *_priv;
}
- (BOOL)tryLock;
- (BOOL)lockBeforeDate:(NSDate *)limit;
@property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@end
NSRecursiveLock *dwlock = [[NSRecursiveLock alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
static void (^RecursiveBlock)(int);
RecursiveBlock = ^(int value) {
[dwlock lock];
NSLog(@"%d加锁成功",value);
if (value > 0) {
NSLog(@"value:%d", value);
RecursiveBlock(value - 1);
}
[dwlock unlock];
NSLog(@"%d解锁成功",value);
};
RecursiveBlock(3);
});
// 运行程序,结果如下
3加锁成功
value:3
2加锁成功
value:2
1加锁成功
value:1
0加锁成功
0解锁成功
1解锁成功
2解锁成功
3解锁成功
__block pthread_mutex_t dwlock;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&cjlock, &attr);
pthread_mutexattr_destroy(&attr);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
static void (^RecursiveBlock)(int);
RecursiveBlock = ^(int value) {
pthread_mutex_lock(&dwlock);
NSLog(@"%d加锁成功",value);
if (value > 0) {
NSLog(@"value = %d", value);
sleep(1);
RecursiveBlock(value - 1);
}
NSLog(@"%d解锁成功",value);
pthread_mutex_unlock(&dwlock);
};
RecursiveBlock(3);
});
// 运行程序,结果如下:
3加锁成功
value = 3
2加锁成功
value = 2
1加锁成功
value = 1
0加锁成功
0解锁成功
1解锁成功
2解锁成功
3解锁成功
dispatch_semaphore_create(long value);
dispatch_semaphore_wait(dispatch_semaphore_t _Nonnull dsema, dispatch_time_t timeout);
dispatch_semaphore_signal(dispatch_semaphore_t _Nonnull dsema);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_time_t overTime = dispatch_time(DISPATCH_TIME_NOW, 6 * NSEC_PER_SEC);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_semaphore_wait(semaphore, overTime);
NSLog(@"线程1开始");
sleep(5);
NSLog(@"线程1结束");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
dispatch_semaphore_wait(semaphore, overTime);
NSLog(@"线程2开始");
dispatch_semaphore_signal(semaphore);
});
// 执行结果如下:
线程1开始
线程1结束
线程2开始
// 如果将上面的 overTime 改成 3 秒,执行结果如下
线程1开始
线程2开始
线程1结束
文章目录 前言 本周最重要的五件事情 本周搞砸的四件事情 本周的四个启发 前言 ...
一.前言 .NET Core 是一个通用开发平台,由 Microsoft 和 GitHub 上的 .NET 社区...
首先插件配备好了,写一个HTML测试一下 首先创建一个文件夹,创建一个HTML 文件...
在项目开始之前我们可以先去了解一下IConfiguration接口,.Net Core Web应用程序...
IT之家2月18日消息外媒 Windows Latest 报道,微软正在与谷歌合作进行一项新的改...
第一课趣味二进制——修改植物大战僵尸数据 任务介绍 学习目标 知识需求 需求工...
昨天刚学了html的一些内容,就迫不及待的想做个京东上面的搜索条,结果做是做出...
JSP spring boot / cloud 使用filter防止XSS 一.前言 XSS(跨站脚本攻击) 跨站脚...
2 月 18 日消息 据外媒 Windowslatest 报道,在预览版本中发现的参考资料表明,...
1.ajax跨域传递值是所需要的回传的类型为jsonp $.ajax({url: "http://.......",t...