第六章 ReentrantLock源码解析2--释放锁unlock()
2016-01-15 18:46
155 查看
最常用的方式:
注:关于lock()方法的源码解析,请参照"第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()",具体链接如下:
/content/5099377.html
释放锁:unlock()
步骤:
1)获取当前的锁数量,然后用这个锁数量减去解锁的数量(这里为1),最后得出结果c
2)判断当前线程是不是独占锁的线程,如果不是,抛出异常
3)如果c==0,说明锁被成功释放,将当前的独占线程置为null,锁数量置为0,返回true
4)如果c!=0,说明释放锁失败,锁数量置为c,返回false
5)如果锁被释放成功的话,唤醒距离头节点最近的一个非取消的节点
源代码:
ReentrantLock:unlock()
View Code
注意:
上边这个程序只是一个示例,在递归的使用中,一定要有递归结束的条件
每有一个lock()方法,就有一个unlock()与之对应,所以在解锁的时候,只需要把传递解锁数量为1就可以。
第二个问题答案:
记住:如果顺着节点头一直next下去可能会不正确。
举个例子:A1->A2->A3
现在我们从A1开始往下走,当我们走到A3的时候,就在这时,一个新节点A4入队,会走下面的入队代码:
可以看到步骤1和步骤2整体并不是原子的,也就是说,当执行完CAS的时候但是2还没执行,这时候队列为:A1-->A2-->A4,如果你使用next的话,可能就把A3给没了,但是node.prev = t(即A4.prev = A3),也就是说前驱节点是已经赋过值了的,如果你从队列结尾A4.prev就会是A3,即A3也丢不了。
int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new ReentrantLock(); lock.lock();//获取锁 try { a++;//业务逻辑 } catch (Exception e) { }finally{ lock.unlock();//释放锁 }
注:关于lock()方法的源码解析,请参照"第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()",具体链接如下:
/content/5099377.html
释放锁:unlock()
步骤:
1)获取当前的锁数量,然后用这个锁数量减去解锁的数量(这里为1),最后得出结果c
2)判断当前线程是不是独占锁的线程,如果不是,抛出异常
3)如果c==0,说明锁被成功释放,将当前的独占线程置为null,锁数量置为0,返回true
4)如果c!=0,说明释放锁失败,锁数量置为c,返回false
5)如果锁被释放成功的话,唤醒距离头节点最近的一个非取消的节点
源代码:
ReentrantLock:unlock()
final ReentrantLock lock = new ReentrantLock(); public void add(){ lock.lock();//获取锁 try { add();//业务逻辑 } catch (Exception e) { }finally{ lock.unlock();//释放锁 } }
View Code
注意:
上边这个程序只是一个示例,在递归的使用中,一定要有递归结束的条件
每有一个lock()方法,就有一个unlock()与之对应,所以在解锁的时候,只需要把传递解锁数量为1就可以。
第二个问题答案:
记住:如果顺着节点头一直next下去可能会不正确。
举个例子:A1->A2->A3
现在我们从A1开始往下走,当我们走到A3的时候,就在这时,一个新节点A4入队,会走下面的入队代码:
可以看到步骤1和步骤2整体并不是原子的,也就是说,当执行完CAS的时候但是2还没执行,这时候队列为:A1-->A2-->A4,如果你使用next的话,可能就把A3给没了,但是node.prev = t(即A4.prev = A3),也就是说前驱节点是已经赋过值了的,如果你从队列结尾A4.prev就会是A3,即A3也丢不了。
相关文章推荐
- canvas--改变颜色
- 子查询和组合查询
- 数据库之联接
- SSH——Hibernate初学者之旅(二)
- Concurrency3
- CentOS 6.5系统服务详解( 转)
- Textfield根据条件显示提示框-LHInfoTextfield(0.1.0)
- hive分组排序 取top N
- hive分组排序 取top N
- 基数和偶数分离
- .NET中提升UAC权限的方法总结
- 数据库之组合查询
- windows相关小知识
- Android 从输入法 到 EditText 研究
- mysql常见错误码
- Linux Bash算数运算方法小结
- Java提高学习之Object(3)
- python中的时间函数编写
- Android GPU加速渲染自定义View 性能改善<13>
- Atitit.java jna 调用c++ dll 的总结