独占锁和共享锁
独占锁
lock.lock() 首先会去尝试获取锁,如果成功,锁状态(state)+1;如果失败,会加入AQS队列中等待锁释放后被唤醒
lock.unlock() 释放锁,由于是重入锁,所以要判断锁状态(state)是否为0(没有任何线程持有锁),为0则会唤醒AQS队列中最前面的还在等待锁的线程,等待cpu来调用线程并获取锁
公平锁和非公平锁的区别在于,公平锁永远是AQS队列中的第一个线程获取锁,而非公平锁由于cpu随机调用线程的原因,可能会直接获取锁而不用进入AQS队列。
ReentrantReadWriteLock 可以控制并发读不阻塞,提高效率
rwl.writeLock(); 写锁,排他锁
rwl.readLock(); 读锁,共享锁,多个读操作可同时进行
线程进入读锁的前提条件:
1.没有其他线程的写锁,
2.没有写请求或者有写请求但调用线程和持有锁的线程是同一个
线程进入写锁的前提条件:
1.没有其他线程的读锁
2.没有其他线程的写锁
锁是针对这个类的所有方法
共享锁
CountDownLatch countDownLatch = new CountDownLatch(3); countDownLatch.await(); countDownLatch.countDown() //执行3次本行代码,await的所有线程会被唤醒