首页 理论教育 临界区与互斥

临界区与互斥

时间:2022-02-28 理论教育 版权反馈
【摘要】:临界区模式是指在一个共享范围中只让一个线程执行的模式。而进出临界区时必要的加锁和解锁操作则是由Java内置支持的。大多数Java语句在编译成伪代码后都由多条虚拟机指令组成,这使它们有可能被其他线程的语句所分割交织。这些保护技术在Java语言中通过互斥方法和互斥代码实现。线程在获得该锁和释放该锁期间称为拥有该锁。

11.4.1 临界区与互斥

临界区模式(Critical Section Pattern)是指在一个共享范围中只让一个线程执行的模式。它是所有其他多线程设计模式的基础,这个模式叫临界区模式,如果把着眼点放在执行的线程上,这个模式就叫单线程执行模式。

Java为了实现同步机制提供了synchronized关键字,我们可以使用它来定义被同步的对象以及临界区,临界区的范围是由一组大括号来标识的。而进出临界区时必要的加锁和解锁操作则是由Java内置支持的。从功能上来说,我们可以认为左大括号起到enter(lock)的作用,而右大括号起到了exit(lock)的作用。下面代码片段演示了synchronized与互斥锁理论功能上的对应关系。

img655

不同的线程操作在访问共享数据时,会因为交织进行而导致线程干扰和内存一致性错误。大多数Java语句在编译成伪代码后都由多条虚拟机指令组成,这使它们有可能被其他线程的语句所分割交织。不能分割交织的操作称为原子动作,这些动作一旦发生,便不能在中途停止,要么完全发生或者根本不发生,直至动作结束。前文所提到的++操作不是一个原子动作。虽然大部分Java语句都不是原子动作,但是也有一些动作可以认定为是原子性的:

·引用类型变量值的读和写,注意这里是引用值的读和写,而不是所引用对象内容的读和写;

·除了long和double之外的简单类型的读和写;

·所有声明为volatile的变量的读和写,包括long和double类型以及引用类型。

使用原子变量访问要比使用互斥代码访问高效得多,但是需要程序员人为地避免内存一致性错误发生。是否需要额外措施避免这些错误往往取决于程序的规模和复杂度。除少数原子动作能同时避免线程干扰和内存一致性错误外,其他操作都需要互斥保护才能避免错误的发生。这些保护技术在Java语言中通过互斥方法和互斥代码实现。

互斥访问机制是建立在内部锁的实体概念上的。API规范通常称这种实体为“管程(monitor)”。内部锁在这两个问题的解决上扮演着重要的角色,它为线程对对象的状态进行强制排他性访问,并建立对于可视性至关重要的“发生过”关系。

每个对象都有一个内部锁与其对应。如果一个线程需要排他一致性访问对象的字段,它首先要在访问之前获得该对象的内部锁。当访问完成时需要释放该内部锁。线程在获得该锁和释放该锁期间称为拥有该锁。一旦线程拥有内部锁,其他任何线程都不能再获得该锁,它们在获得该锁时会被阻塞。

当线程释放该内部锁时,“发生过”关系就在该动作和同把锁的后继动作之间建立起来。创建互斥性操作的方法是互斥语句。在Java中,实现互斥语句的关键字叫synchronized(同步),互斥语句的语法格式如下:

img656

这里lock是提供内部锁的对象。这个语句是互斥代码的一般写法。另外往往整个方法需要进行互斥,这时就有所谓互斥方法。互斥方法根据方法类型的不同分为实例互斥方法和静态互斥方法。实例互斥方法的例子如下:

img657

互斥实例方法实际获得的是当前实例对象的内部锁,前面的这个实例方法相当于下面写法的互斥语句:

img658

静态互斥方法的例子如下:

img659

img660

静态互斥方法实际获得的是当前类Class对象的内部锁,前面这个静态方法相当于下面写法的互斥语句:

img661

互斥语句在互斥代码开始时获得对象的内部锁,在语句结束或互斥方法返回时释放锁。互斥语句块相对于互斥方法来说主要有两个作用:

·避免不必要的死锁;

·细化互斥的粒度。

注意:线程不能获得已经被另一线程所拥有的锁,但线程可以获取它已经拥有的锁。允许线程多次获取同一把锁使互斥方法可以重入,这样互斥代码就能直接或者间接调用另外有互斥代码的方法,而两处互斥代码可以使用同一把锁。如果没有互斥重入机制,我们需要非常小心的编码才能避免这种调用带来的死锁。

又如例11-2中,关于资源类定义:

img662

当去掉add()方法中的synchronized:

img663

然后观察各线程取得的数值,并与例11-2运行结果对比。程序运行结果如下:

img664

注意:构造函数是不能互斥的,在构造函数前使用synchronized关键字是语法错误。互斥构造函数没有任何意义,因为在其构造时,只有创建该对象的线程可以访问它。并且,final字段的访问是不需要互斥的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈