Java中锁的分类
2013-12-14 21:35
295 查看
1.内部锁
就是对象本身,每个Java对象都可以隐式地扮演一个用于同步的锁的角色;这些内置的锁被称
为内部锁(intrinsic locks)或监视器锁(monitorlocks)。执行线程进入synchronized块之前会
自动获得锁;而无论通过正常控制路径退出,还是从块中抛出异常,线程都在放弃对
synchronized块的控制时自动释放锁。获得内部锁的唯一途径是:进入这个内部锁保护的同步
块或方法。内部锁在Java中扮演了互斥锁(mutual exclusion lock,也称mutex)的角色,意味着
至多只有一个线程可以拥有锁,当线程A尝试请求一个被线程B占有的锁时,线程A必须等待或者
阻塞,直到B释放它。如果B永远不释放锁,A将永远等下去。同一时间,只能有一个线程可以运
行特定保护的代码块,因此,由同一个锁保护的synchronized块会各自原子地执行,不会相互
干扰。在并发的上下文中,原子性的含义不慌不忙 它在事务应用中相同---一组语句
(statements)作为单独的,不可分隔的单元运行。执行synchronized块的线程,不可能看到会
有其他线程能同时执行同一个锁保护的synchronized块。
2.Java中的私有锁对象
private Object lock = new Object();
public void foo(){
synchronized(lock){
......
}
}
使用私有锁对象,而不是对象的内部锁(或任何其它可公共访问的锁),有很多好处,私有的锁
对象可以封装锁,这样客户端代码无法得到它。然而可公共访问的锁允许客户端涉足它的同步
策略----正确或不正确地。客户端不正确地得到另一个对象的锁,会引起活跃度方面的问
题。
3.其它锁
我们还可针对代表某种共享资源的对象加锁。比如一些集合类等待。
就是对象本身,每个Java对象都可以隐式地扮演一个用于同步的锁的角色;这些内置的锁被称
为内部锁(intrinsic locks)或监视器锁(monitorlocks)。执行线程进入synchronized块之前会
自动获得锁;而无论通过正常控制路径退出,还是从块中抛出异常,线程都在放弃对
synchronized块的控制时自动释放锁。获得内部锁的唯一途径是:进入这个内部锁保护的同步
块或方法。内部锁在Java中扮演了互斥锁(mutual exclusion lock,也称mutex)的角色,意味着
至多只有一个线程可以拥有锁,当线程A尝试请求一个被线程B占有的锁时,线程A必须等待或者
阻塞,直到B释放它。如果B永远不释放锁,A将永远等下去。同一时间,只能有一个线程可以运
行特定保护的代码块,因此,由同一个锁保护的synchronized块会各自原子地执行,不会相互
干扰。在并发的上下文中,原子性的含义不慌不忙 它在事务应用中相同---一组语句
(statements)作为单独的,不可分隔的单元运行。执行synchronized块的线程,不可能看到会
有其他线程能同时执行同一个锁保护的synchronized块。
2.Java中的私有锁对象
private Object lock = new Object();
public void foo(){
synchronized(lock){
......
}
}
使用私有锁对象,而不是对象的内部锁(或任何其它可公共访问的锁),有很多好处,私有的锁
对象可以封装锁,这样客户端代码无法得到它。然而可公共访问的锁允许客户端涉足它的同步
策略----正确或不正确地。客户端不正确地得到另一个对象的锁,会引起活跃度方面的问
题。
3.其它锁
我们还可针对代表某种共享资源的对象加锁。比如一些集合类等待。
相关文章推荐
- java语言基础(81)——IO流概述、分类及基本使用
- J.U.C(java.util.concurrent)原子类分类
- 冒泡排序... 分类: java 2009-11-02 14:09 224人阅读 评论(0) 收藏
- 根据字节数截取字符串... 分类: java 2009-11-05 19:21 235人阅读 评论(0) 收藏
- java中的访问权限修饰符 含义及分类
- StringTokenizer 的 用法(2007-09-20 23:49:33| 分类: java 技术)
- 近一个月的面试总结 分类:JAVA
- java 常见性能优化策略分类
- Java for linux Runtime 执行需要转义的脚本(shell) 分类: Linux Java 2014-12-25 20:35 344人阅读 评论(2) 收藏
- 【Java设计模式】设计模式分类
- JAVA中异常的分类
- java IO流的概念与分类
- Java异常分类及统一处理详解
- HashMap和Hashtable的区别 2013/11/12 | 分类: 基础技术 | 5 条评论 | 标签: 基础技术 分享到: 128 本文由 ImportNew - 唐小娟 翻译自 Javar
- 成绩分类 总结(Java)
- 将String转化为Long,并将Long转化为Date 分类: B1_JAVA 2014-06-30 16:23 1249人阅读 评论(0) 收藏
- 使用无连接的数据报(UDP)进行通信 分类: Java 2015-07-27 20:59 13人阅读 评论(0) 收藏
- Java语言基础{Java_se(02)}-字面量和常量-变量的基本定义和使用-Java表达式-数据类型和分类-基本数据类型的转换-算数运算符-赋值运算符-比较运算符-三元运算符-逻辑运算符
- java IO流相关的类的分类和总结
- Java异常分类