NSURL *url = [NSURL URLWithString:@""]]
//创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@""]]
__block NSData *responseData = nil
__block NSError *responseError = nil
NSURLSession *session = [NSURLSession sharedSession]
dispatch_semaphore_t semaphore= dispatch_semaphore_create(0)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
// ...
responseData = data
responseError = error
NSLog(@"-----%@",response)
dispatch_semaphore_signal(semaphore)
}]
[task resume]
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
在类中添加一个成员变量,private int count = 0在button_click(以你的程序为准)函数中,将count加1。
void button_click()
{
count ++
if(count >= 3)
this.close()//此函数是窗体的关闭函数
Redisson的Github地址: https://github.com/redisson/redisson/wiki/Table-of-Content
基于Redis的Redisson分布式可重入锁RLock对象实现了java.util.concurrent.locks.Lock接口。
大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个 监控锁的看门狗 ,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。
在RedissonLock类的renewExpiration()方法中,会启动一个定时任务每隔30/3=10秒给锁续期。如果业务执行期间,应用挂了,那么不会自动续期,到过期时间之后,锁会自动释放。
另外Redisson还提供了leaseTime的参数来指定加锁的时间。超过这个时间后锁便自动解开了。
如果指定了锁的超时时间,底层直接调用lua脚本,进行占锁。如果超过leaseTime,业务逻辑还没有执行完成,则直接释放锁,所以在指定leaseTime时,要让leaseTime大于业务执行时间。RedissonLock类的tryLockInnerAsync()方法
分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。在读写锁中,读读共享、读写互斥、写写互斥。
读写锁测试类,当访问write接口时,read接口会被阻塞住。
Redisson的分布式信号量与的用法与java.util.concurrent.Semaphore相似
现在redis中保存semaphore的值为3
然后在TestController中添加测试方法:
当访问acquireSemaphore接口时,redis中的semaphore会减1;访问releaseSemaphore接口时,redis中的semaphore会加1。当redis中的semaphore为0时,继续访问acquireSemaphore接口,会被阻塞,直到访问releaseSemaphore接口,使得semaphore>0,acquireSemaphore才会继续执行。
CountDownLatch作用:某一线程,等待其他线程执行完毕之后,自己再继续执行。
在TestController中添加测试方法,访问close接口时,调用await()方法进入阻塞状态,直到有三次访问release接口时,close接口才会返回。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)