java锁的理解
2015-06-17 14:11
330 查看
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。
互斥:即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。
可见性:必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
锁的可重入性
注意outer()和inner()都被声明为synchronized,这在Java中和synchronized(this)块等效。如果一个线程调用了outer(),在outer()里调用inner()就没有什么问题,因为这两个方法(代码块)都由同一个管程对象(”this”)所同步。如果一个线程已经拥有了一个管程对象上的锁,那么它就有权访问被这个管程对象同步的所有代码块。这就是可重入。线程可以进入任何一个它已经拥有的锁所同步着的代码块。
互斥:即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。
可见性:必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
锁的可重入性
public class Reentrant{ public synchronized outer(){ inner(); } public synchronized inner(){ //do something } }
注意outer()和inner()都被声明为synchronized,这在Java中和synchronized(this)块等效。如果一个线程调用了outer(),在outer()里调用inner()就没有什么问题,因为这两个方法(代码块)都由同一个管程对象(”this”)所同步。如果一个线程已经拥有了一个管程对象上的锁,那么它就有权访问被这个管程对象同步的所有代码块。这就是可重入。线程可以进入任何一个它已经拥有的锁所同步着的代码块。
相关文章推荐
- Quartz1.7 动态添加、修改和删除定时任务(非spring集成版)
- Java生成Excel表格的代码
- Java基础 Collections Arrays 增强for循环 可变参数
- eclipse如何修改dynamic web module version
- Java NIO系列教程(十) Java NIO DatagramChannel
- Java: |(或运算) 与 多选判断
- Eclipse搜索快捷键
- jsrsasign 前台签名,Java后台验证前台签名
- Java: 在dos窗口输入密码,不要把密码直接显示出来,原来可以这么简单
- spring定时器quartz
- JavaWeb学习总结第五篇--认识Cookie机制
- eclipse打开选中文件(文件夹,包)的当前目录
- 解决Myeclipse/eclipse控制台输出乱码的问题
- Java: String.split(....); 结果很意外
- 路径或文件名中含有中文的jar文件双击启动不了 -> Java7的Bug?
- 解决Java Web项目中文乱码的方法
- 中科院NLPIR中文分词java版
- java注释
- code::Blocks生成的dll 在 java jni 调用遇到的问题
- 随笔:spring+quartz定时任务(1)