目录
50.AQS的核心思想是什么?
51.AQS有哪些核心方法?
52.AQS定义什么样的资源获取方式?
53.AQS底层使用了什么样的设计模式?
54.什么是可重入,什么是可重入锁?他用来解决什么问题?
55.ReentrantLock的核心是AQS,那么他怎么来实现的,继承吗?
56.ReentrantLock是如何实现公平锁的?
57.ReentrantLock是如何实现非公平锁的?
58.ReentrantLock默认实现的是公平锁还是非公平锁?
59.为什么有了ReentrantLock还需要ReentrantReadWriteLock?
60.ReentrantReadWriteLock底层实现原理?
50.AQS的核心思想是什么?
AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程假如到队列中。
51.AQS有哪些核心方法?
52.AQS定义什么样的资源获取方式?
AQS定义了两种资源获取方式:
独占(只有一个线程能独立访问执行,又根据是否按队列的顺序分为公平锁和非公平锁,如ReentrantLock)
共享(多个线程可同时访问执行,如Semaphore,CountDownLatch,CyclicBarrier)。ReentrantReadWriteLock可以看成是组合式,允许多个线程同时对某一资源进行读。
53.AQS底层使用了什么样的设计模式?
模板,共享锁和独占锁在一个接口类中。
54.什么是可重入,什么是可重入锁?他用来解决什么问题?
可重入:(来源于维基百科)若一个程序或子程序可以”在任意时刻中断然后操作系统调度执行另外一段代码,这点代码又调用了该子程序不会出错“,则成其为可重入的。即当该子程序正在运行时,执行线程可以再次进入并执行它,仍然获得符合设计时预期的结果。与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。
可重入锁:又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。
55.ReentrantLock的核心是AQS,那么他怎么来实现的,继承吗?
ReentrantLock总共有三个内部类,并且三个内部类是紧密相关的,下面先看三个类的关系。
说明:ReentrantLock类内部总共存在Sync,NonfairSync,FairSync三个类,NonfairSync与FairSync类继承自Sync类,Sync类继承自AbstractQueuedSynchronizer抽象类。
56.ReentrantLock是如何实现公平锁的?
FairSync
57.ReentrantLock是如何实现非公平锁的?
UnFairSync
58.ReentrantLock默认实现的是公平锁还是非公平锁?
非公平锁
59.为什么有了ReentrantLock还需要ReentrantReadWriteLock?
读锁和写锁分离:ReentrantReadWriteLock表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁ReadLock和写锁WriteLock,可以通过这两种锁实现线程间的同步。
60.ReentrantReadWriteLock底层实现原理?
ReentrantReadWriteLock有五个内部类,五个内部类之间也是相互关联的。内部类的关系如下图所示:
说明:如上图所示,Sync继承自AQS,NonfairSync继承自Sync类,FairSync继承自Sync类;ReadLock实现了Lock接口,WriteLock也实现了Lock接口。