线程同步

来源:互联网 发布:开封知言小学怎么样 编辑:程序博客网 时间:2024/05/18 02:12

线程同步  

监视器

java监视器支持两种线程:互斥和协作。

java虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独 立而不干扰地工作。

协作则通过object类的wait方法和notify方法来实现,允许多个线程为了同一个目标而共同工作。

我们将监视器比作一个建筑物,里面有很多房间,房间里面有一些数据,并且同一个时间只能被一个线程占据。一个线程进入房间到离开为止,独占其中全部的数据。

进入这个数据叫做进入监视器。

进入房间叫做获得监视器。

占据房间叫做持有监视器。

离开房间叫做释放监视器。

离开建筑叫做退出监视器。

 

互斥原理

对一个监视器来说监视区域是最小的,不可分割的代码块。同一个监视器中,监视区域只会被一个线程执行。

当一个线程到达了一个监视区域的开始处,它就会放置到监视器的入口区。如果没有其他线程等待,它就会进入监视器并且获得监视器,当执行完监视区域的代码后,就会释放并退出监视器。

如果当前监视器正在被另外一个线程持有,那么它就会进入一个等待队列(如果有其他线程也在等待进入监视器)。当持有线程退出之后,只能有等待队列中的一个线程进入并持有该监视器,其他的线程仍旧留会在等待队列中。

 

协作原理

当一个线程需要一些特别的数据,而由另一个线程负责改变这些数据的状态时,同步显得特别重要。

eg,一个读线程会由一个缓冲区中读取数据,而当前这个缓存区是空的,就需要一个写线程写入数据,当写数据完成写入,读线程才能做读取操作。

java虚拟机使用的这种监视器叫做等待并唤醒监视器。

这种监视器中,一个已经持有该监视器的线程,可以通过调用等待命令,暂停自身的执行。当这个线程执行等待命令后,就会释放该监视器并进入一个等待区,并会一直在那里持续等待状态,直到一段时间后该监视器内的其他线程调用了唤醒命令。当一个线程调用唤醒命令后,它会持续持有监视器,直到它主动释放监视器。当执行了唤醒命令或者执行完监视区域,释放监视器后,等待线程会苏醒,其中的一个会重新获得监视器,判断状态条件,以便决定是否继续继续进入等待状态或者退出或者执行监视区域。

Java虚拟机监视器

Java虚拟机监视器分为三个部分:

如图:


1. 入口区

2. 持有者

3. 等待区

所对应的操作:

1. 进入入口区。

2. 获取锁,作为这个监视器的持有者,此时便可执行监视器中的代码了。

3. 暂时释放锁,进入等待区。等待某些条件的发生。wait

4. 被标记会唤醒状态,再次获得锁,持有监视器,notify

5. 完成任务,释放锁并退出。

对象锁

       Java程序需要为两种数据进行多线程的访问协调

        (1)保存在堆中的实例变量

        (2)保存在方法区中的类变量

       在JVM中,每一个对象和类在逻辑上都和一个监视器相关联,对于对象而言,相关联的监视器保护对象的实例变量,对于类而言,监视器保护类变量,如果一个对象没有实例变量,或者一个类没有类变量,则监视器什么都不监视

         JVM为每一个对象和类都关联一个锁,锁的价值在于任何时候只能够有一个线程拥有访问实例变量或者类变量的特权,如果一个线程获得锁,在它释放锁之前,没有任何其他的线程能够访问共享数据。

        每一个类也和一个对象锁关联,是代表类型数据的java.lang.Class类型的对象的锁。

一个线程可以允许多次对同一个对象上锁。对于每一个对象来说,Java虚拟机维护一个计数器,记录对象被加了多少次锁。没有被锁的对象计数器为0.第一个线程第一次获得锁时,计数器变为1,线程每加锁一次,计数器加1.只有已经拥有了这个对象的锁的线程才能对该对象加锁(即重入,类似ReentrantLock),在它释放锁之前,其他线程不能对这个对象加锁。每当线程释放锁一次,计数器减一。当计数器减为0时,锁被释放,其他线程才可以使用它。

Java虚拟机提供两种监视区域:同步语句和同步方法。

同步语句:

Class test{

Void method() {

Synchronized(this) {

doSth();

}

}

}

同步方法:

Class test{

Synchronized Void method() {

doSth();

}

}

方法内的同步块会使用monitorentermonitorexit两个操作码。当Java虚拟机遇到monitorenter时,获得栈中Objectref所引用的对象的锁。如果已经获得了锁,计数器加1.线程中每条monitorexit指令都会引起计数器减1.当计数器变成0的时候,监视器就被释放了。

原创粉丝点击