`

第17章 线程和锁

阅读更多

工作之余翻译oracle官方的Java Language Specification,今天翻译第17,线程和锁。原文地址:http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html

 

Chapter 17. Threads and Locks

在前几章我们大多时候关注的是在单条语句或表达式在一个时间点的执行状态,换句话说,就是单线程。JAVA虚拟机能支持许多线程同时执行。这些线程独立的执行代码和操作共享内存的值和对象。线程支持在有许多硬件处理器,单一硬件处理器上的时间分片,多硬件处理器的时间分片等环境。

        Thread类代表线程。用户创建线程的唯一方法是创建这个类的对象。每个线程关联一个对象。这个线程对应的Thread对象的start()方法被调用时该线程将要启动。

     线程的行为是不可预支的,特别是没有正确的同步时。本章重要描述多线程的语义。他包括哪些值在被多线程更新时通过共享内存其他线程可见的规则。对规范来说,不同的硬件的内存模型是相似的。这些语义JAVA程序语言模型所知,当没有混乱出现,我们就可以简单的参考内存模型。

      这些语义没有规定多线程程序应该被怎样执行。多线程的行为描述是可以被展示的。任何执行策略只能产生一种被接受的执行策略。

       

17.1. Synchronization

JAVA程序语言提供多种线程通信机制。大多数基本的是这些方法是synchronization(同步的),采用monitors实现。每个JAVA对象会关联一个monitor,一个线程可以锁和解锁。一个线程可以锁一个指定的监视器多次。每次解锁抵消一次加锁带来的影响。         

         Synchronized语句估算一个对象的引用。然后在这对象的监视器上试途完成一个锁动作,否则不处理直到锁动作能成功的完成。加锁动作完成后,synchronized语句块内的语句被执行。如果语句体被正常执行或者中断,一个解锁动作在这个监视器上自动完成。

    一个同步方法在执行时会自动执行一个加锁动作。方法体不允许被执行直接加锁动作成功完成。如果该方法是一个实例方法,这个锁所在监视器是被调用的这个实例对象的监视器(这个对象在方法体执行期间被标识为this).如果方法是静态的,这个锁监视器被关联到这个方法所在类对象上。执行方法体自然或者中断,一个解锁动作会在该监视器上执行。

    JAVA语言不阻止也不需要发现死锁。程序在持有多个对象锁时应该用传统的方法来避免死锁。如果需要可以创建更高等级的私有锁。

    其他机制,比如读写一个volatile变量和用 java.util.concurrent 包下的类。提供可选的同步方法。   

17.2. Wait Sets and Notification

         每个对象除了关联了一个监视器之外,还关联了一个等候区。等候集合是一个线程集合。

         对象首次创建时,等候区是空的。他的动作元素包含原子的增加和移除线程。等候区的操作只能通过以下方法:Object.wait,Object.notify,Object.notifyAll

         等候区的操作也会影响一个线和的中断状态。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics