并发编程(一)——Java中的线程状态

原创
2016/10/20 21:20
阅读数 358

一、Java线程状态变迁

二、Java线程同步机制

可以在语言级支持多线程是Java语言的一大优势,这种支持主要集中在同步上,或调节多个线程的活动和共享数据。Java所使用的同步机制是监视器。

1、监视器

Java中的监视器支持两种线程:互斥和协作。Java虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独立而互不干扰地工作。协作则是通过Object类的wait和notify方法来实现,允许多个线程为了同一个目标而工作。

Java虚拟机中的监视器模型如下图所示,将监视器分成了三个区域。中间的大方框包括一个单独的线程,是监视器的持有者;左边小的方框中是入口区;右边另一个小方框式等待区。

图中显示了线程与监视器交互所必需“通过”的几道门。当一个线程到达监视区域的开始处时,它会通过最左边的1号门进入监视器。如果没有任何线程正持有监视器,也没有其他线程正在入口区等待,这个线程就会立刻通过2号门,从而持有监视器。作为这个监视器的持有者,它将继续执行监视区域中的代码。或者也可能出现另一种情况,已经又一个线程正持有监视器,这个新到达的线程就必须在入口区中等待。

图中有3个线程在入口区中暂停,4个线程在等待区中暂停,这些线程会一直在那儿,直到监视器当前的持有者释放监视器。活动线程会通过两条途径释放监视器:完成它正在执行的监视区域或者执行等待命令。

如果上一个监视器的持有者在它释放监视器前没有执行唤醒命令(同时在此之前也没有任何等待线程被唤醒并等待唤醒,那么位于入口区中的那些线程就会竞争获得监视器。如果上一个持有者执行了唤醒命令,入口区中的线程就不得不与等待区中的一个或多个线程来竞争。如果入口区中的一个线程在竞争中获胜,它就会通过2号门,从而成为监视器新的持有者。而如果是等待区中的某个线程赢了,它会通过4号门退出等待区并重新获得监视器。

2、对象锁

在Java虚拟机中,每个对象和类在逻辑上都是和一个监视器相关联的。对于对象来说,相关联的监视器保护的是对象的实例变量。对于类来说,监视器保护类的类变量。

为了实现监视器的排他性监视能力Java虚拟机为每一个对象和类都关联一个锁。一个锁就像一种任何时候都只允许一个线程“拥有”的特权。线程访问实例变量或者类变量不需要获取锁。但是如果线程获取了锁,那么在它释放这个锁之前,就没有其他线程可以获取同样数据的锁了。(“锁住一个对象”就是获取对象相关联的监视器。)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部