独占锁和共享锁

独占锁

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的所有线程会被唤醒

 

posted on 2017-07-28 14:16  摩羯的小石头  阅读(340)  评论(0编辑  收藏  举报