参考文章: http://blog.csdn.net/chen77716/article/details/6618779
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。
数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令。
synrhronized使用广泛。其应用层的语义是可以把任何一个非null对象作为"锁", 当synchronized作用在方法上时,锁住的便是对象实例(this); 当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁; 当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。 在HotSpot JVM实现中,锁有个专门的名字:对象监视器。
线程状态及状态转换
当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程: Contention List:所有请求锁的线程将被首先放置到该竞争队列 Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck Owner:获得锁的线程称为Owner !Owner:释放锁的线程
看的过程中又看到这两篇文章:
http://www.cnblogs.com/javaminer/p/3889023.html
http://www.cnblogs.com/javaminer/p/3892288.html?utm_source=tuicool&utm_medium=referral
时间: 2024-10-22 18:50:07