
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
并发编程开发是程序员在学习Java编程开发语言的时候需要重点掌握的一个编程开发方式,而本文我们就通过案例分析来简单了解一下,Java并发编程开发基础知识分享。
ReentrantLock#lock
lock方法终是由sync实现的,公平锁的sync是FairSync,非公平锁是UnfairSync。
两者lock方法的区别是,公平锁FairSync直接调用acquire(1)方法,非公平锁UnfairSync则先尝试获得锁资源(直接尝试修改锁状态)、获取不到才调用acquire(1)方法。
acquire方法由AQS实现。
AbstractQueuedSynchronizer#acquire
先调用tryAcquire方法尝试获得锁资源,如果获取不成功的话,调用acquireQueued方法进入队列排队等待。
如果是通过acquireQueued方法经过排队获取到锁资源、并且方法返回true的话,说明在线程排队等待锁资源的过程中收到了中断信号,但是由于线程处于挂起状态、尚未获得锁资源,不能对CLH队列做操作,所以需要等到获取到锁资源之后、再调用selfInterrupt()中断。
公平锁与非公平锁的tryAcquire方法的实现逻辑不同。
公平锁FairSync#tryAcquire方法判断锁状态处于空闲的话,先调用hasQueuedPredecessors方法,判断当前CLH队列中是否存在比当前线程等待时间更久的线程,没有的话才尝试获取锁资源(CAS方式修改锁状态)。
非公平锁UnFairSync#tryAcquire方法在判断锁处于空闲状态的话,直接尝试获取锁资源(CAS方式修改锁状态)。
不管是FairSync还是UnFairSync的tryAcquire方法,如果判断锁资源是被当前线程独占,则可以直接再次获取锁资源,锁状态state在当前值的基础上加1。这也就是可重入锁的意思,同一线程可以多次获得锁资源。
AbstractQueuedSynchronizer#acquireQueued
在tryAcquire获取锁资源失败后,调用acquireQueued方法,方法名很好的说明了方法的作用:通过排队获得锁资源。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。