标签:软件 style 硬件 文章 tar 调用 并发 竞争 zed
参考文章: 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
【转载】Java中的锁机制 synchronized & Lock
标签:软件 style 硬件 文章 tar 调用 并发 竞争 zed
原文地址:http://www.cnblogs.com/charlesblc/p/5994162.html