中国免费网站服务器主机域名,wordpress rss feed,友情链接图片,深圳集智邦是网站建设公司AQS
AQS 是多线程同步器#xff0c;它是 J.U.C 包中多个组件的底层实现#xff0c;如 Lock、 CountDownLatch、Semaphore 等都用到了 AQS.
锁机制 从本质上来说#xff0c;AQS 提供了两种锁机制#xff0c;分别是排它锁#xff0c;和共享锁。
排他锁
排它锁#xff…AQS
AQS 是多线程同步器它是 J.U.C 包中多个组件的底层实现如 Lock、 CountDownLatch、Semaphore 等都用到了 AQS.
锁机制 从本质上来说AQS 提供了两种锁机制分别是排它锁和共享锁。
排他锁
排它锁就是存在多线程竞争同一共享资源时同一时刻只允许一个线程访问该 共享资源也就是多个线程中只能有一个线程获得锁资源比如 Lock 中的 ReentrantLock 重入锁实现就是用到了 AQS 中的排它锁功能。
共享锁
共享锁也称为读锁就是在同一时刻允许多个线程同时获得锁资源比如 CountDownLatch 和 Semaphore 都是用到了 AQS 中的共享锁功能。
核心的问题
设计AQS整个体系需要解决的三个核心的问题①互斥变量的设计以及多线程同时更新互斥变量时的安全性②未竞争到锁资源的线程的等待以及竞争到锁资源的线程释放锁之后的唤醒③锁竞争的公平性和非公平性。
方案
AQS采用了一个int类型的互斥变量state用来记录锁竞争的一个状态0表示当前没有任何线程竞争锁资源而大于等于1表示已经有线程正在持有锁资源。一个线程来获取锁资源的时候首先判断state是否等于0如果是(无锁状态)则把这个state更新成1表示占用到锁。此时如果多个线程进行同样的操作会造成线程安全问题。AQS采用了CAS机制来保证互斥变量state的原子性。未获取到锁资源的线程通过Unsafe类中的park方法对线程进行阻塞把阻塞的线程按照先进先出的原则加入到一个双向链表的结构中当获得锁资源的线程释放锁之后会从双向链表的头部去唤醒下一个等待的线程再去竞争锁。另外关于公平性和非公平性问题AQS的处理方式是在竞争锁资源的时候公平锁需要判断双向链表中是否有阻塞的线程如果有则需要去排队等待而非公平锁的处理方式是不管双向链表中是否存在等待锁的线程都会直接尝试更改互斥变量state去竞争锁。