上一篇讲公平锁,如果没看到的朋友可以先了解下上一篇 聊聊AbstractQueuedSynchronizer的实现(一)

【非公平锁】

看完公平锁,在来看非公平简直就是轻松加愉快了。这里,我们再来回顾一下公平锁,就是让CLH队列中,先入队的节点(线程)获取到锁。非公平锁就是不从队列中去取节点,而是任意线程,只要查看到state没有被占用,就可以了。看如下代码:

【CAS】

(我这里想聊一聊操作系统的CAS,其实java中CAS通过调用JNI来实现,在JNI本地方法中通过C语言调用CPU指令来完成的)CAS就是compare and swap的缩写,比较并交换的意思。在AQS中,它是调用了CPU的系统指令,这是一条原语操作。可是它明明是两个操作(比较和交换),但为什么是原子操作呐?

根据查看openJDK源代码(这里我就不贴出来了,有兴趣的朋友可以去下载一份)发现,程序会判断当前处理器的类型来决定。在以前老的操作系统,比如说奔腾之前,通过是否加一个lock前缀指令锁住消息总线,使得其他处理器无法通过总线访问内存,但是这样的操作会带来很多额外的开销。如果在多处理器(目前大多数咱们用的都是多处理器)上执行,就需要加lock前缀指令;否则如果是单处理器,就不需要。因为单处理器能维护自身顺序执行的一致性。

2 收藏


直接登录

推荐关注