码迷,mamicode.com
首页 > 其他好文 > 详细

Lock()是怎么实现的

时间:2017-07-20 10:11:28      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:临界区   放弃   并发   任务   lock   线程   没有   等待队列   ant   

在并发编程中,经常会申请一块代码去加锁操作,比如new Reentrantlock().lock();

需求一:假设我们有十个线程t1-t10同时到达临界区,只有一个线程能获取锁,其余线程只能等待其释放锁才有机会去获得锁。

对于这么一个需求,如果是你该如何去设计lock()这个方法来满足以上需求?

1.设计一个状态 volatile state = 0;

2.当第一个线程调用lock方法,那么立马设置state值为1,表示获取了锁;如果当前线程再次获取锁也就是重入锁,那么state++;

大致思路  if(cas(state,1));如果成功则表示获得锁,假设t1获得锁,不会被阻塞,直接进入临界区。

3.其他线程调用lock方法,发现state已经被人修改不为0,那么放弃获取锁,把自己丢到一个等待队列里面,等待别人唤醒自己;

其他线程同样判断 if(cas(state,1));只要t1没有释放,state不为0,判断结果肯定是false,那么进入到等待队列。

需求二:线程1结束了任务释放锁,那么如何去通知其他线程?

其实这里又出现两种情况,公平锁与非公平锁。如果是公平锁那么一旦线程1任务结束,将会去唤醒等待队列里等待最久的元素,也就是

需要先进先出队列来满足这种需求。如果是非公平锁,那么会出现插队的情况产生,也就是任务1刚好结束的时候又来个一个线程11,该线程

会调用cas(state,1),恰好成功(其实几率很小),那么11线程就会优先于等待中的9个线程先执行

 

Lock()是怎么实现的

标签:临界区   放弃   并发   任务   lock   线程   没有   等待队列   ant   

原文地址:http://www.cnblogs.com/jiangxjun/p/7208983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!