Java并发编程-互斥

Java并发编程-互斥

ID:38363907

大小:34.50 KB

页数:5页

时间:2019-06-11

Java并发编程-互斥_第1页
Java并发编程-互斥_第2页
Java并发编程-互斥_第3页
Java并发编程-互斥_第4页
Java并发编程-互斥_第5页
资源描述:

《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  互斥语句在互

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。