欢迎来到天天文库
浏览记录
ID:38363907
大小:34.50 KB
页数:5页
时间:2019-06-11
《Java并发编程-互斥》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java并发编程-互斥责任编辑:覃里作者:WilliamChen的博客 2009-11-19 来源:IT168网站文本Tag:J2SEJava 【IT168技术文章】不同线程的操作在访问共享数据时,会因为交织进行而导致线程干扰和内存一致性错误。大多数Java语句在编译成伪代码后都由多条虚拟机指令组成,这使它们有可能被其他线程的语句所分割交织。不能分割交织的操作乘称作原子动作,这些动作一旦发生,便不能在中途停止,要么完全发生,要么根本不发生,直至动作结束。前文所提到的++操作不是一个原子动作。虽然大部分Java语句都不是
2、原子动作,但是也有一些动作可以认定为是原子性的: 1.引用类型变量值的读和写。注意这儿是引用值的读写,而不是所引用对象内容的读和写。 2.除了long和double之外的简单类型的读和写。 3.所有声明为volatile的变量的读和写,包括long和double类型以及引用类型 原子动作是不能被交织分割的,因此可以放心使用,不用担心线程干扰问题。但注意内存一致性错误对于原子动作仍然是存在的。使用volatile关键字能够减小内存一致性错误发生的风险,任何对volatile变量的写操作和之后进行的读操作都会自动建立“发
3、生过”关系。这意味着任何对于volatile变量的改变都是对其他线程可见的。另外当某线程读一个volatile变量时,它看到的不仅仅是对该变量的最新改动,也能看到这一改变带来的副作用。 使用原子变量访问要比使用互斥代码访问要高效得多,但是需要程序员人为地避免内存一致性错误发生。是否需要额外措施避免这些错误往往取决于程序的规模和复杂度。java.util.concurrent包中的类提供了不依赖于互斥原语的方法,在后面的文章我们将逐步介绍。 内部锁与互斥 前面提到除少数原子动作能同时避免线程干扰和内存一致性错误外,其它操
4、作都是需要互斥保护才能避免错误的发生。这些保护技术在Java语言中通过互斥方法和互斥代码实现。 互斥访问机制是建立在内部锁的实体概念上的。API规范通常称这种实体为“管程(monitor)”。内部锁在这两个问题的解决上扮演着重要的角色,它为线程对对象的状态进行强制排他性访问,并建立对于可视性至关重要的“发生过”关系。 每个对象都有一个内部锁与其对应。如果一个线程需要排他一致性访问对象的字段,它首先要在访问之前获得该对象的内部锁。当访问完成时需要释放该内部锁。线程在获得该锁和释放该锁期间称作拥有该锁。一旦线程拥有内部锁,其
5、他任何线程都不能再获得该锁,它们在获得该锁时会被阻塞。 当线程释放该内部锁时,“发生过”关系就在该动作和同把锁的后继动作之间建立起来。 互斥语句 创建互斥性操作的方法是互斥语句。互斥语句的语法格式如下:1synchronized(lock){23 //criticalcodeforaccessingshareddata.45 //...67 }89 在Java中,实现互斥语句的关键字叫synchronized(同步),我认为这是一个不合适的术语。同步应该定义为按照固定顺序发生的动作序列。这儿的含义显然是互斥访问
6、的含义。 这儿lock是提供内部锁的对象。这个语句是互斥代码的一般写法。另外往往整个方法需要进行互斥,这时就有所谓互斥方法。互斥方法根据方法类型的不同分为实例互斥方法和静态互斥方法。实例互斥方法的例子如下:1publicsynchronizedvoidaddName(Stringname){23 //Addingnametoasharedlist.45 }67 互斥实例方法实际获得的是当前实例对象的内部锁,前面的这个实例方法相当于下面写法的互斥语句:89 publicvoidaddName(Stringname){
7、1011 synchronized(this){1213 //Addingnametoasharedlist.1415 }1617 }1819 静态互斥方法的例子如下:1 publiclassClassA{23 publicstaticsynchronizedvoidaddName(Stringname){45 //Addingtoastaticsharedlist.67 }89 }1011 静态互斥方法实际获得的是当前类Class对象的内部锁,前面这个静态方法的相当于下面写法的互斥语句:1 public
8、classClassA{23 publicstaticvoidaddName(Stringname){45 synchronized(ClassA.class){67 //Addingtostaticsharedlist.89 }1011 }1213 }1415 互斥语句在互
此文档下载收益归作者所有