Lock、Synchronized锁区别解析( 七 )
在 "aa方法开始了Thread-0" 输出后 , 等待了两秒后 , 通过 await 方法阻塞当前线程 , 然后把锁资源让给 "Thread-1" , 输出 "bb方法开始了Thread-1", 两秒后再输出 "bb方法结束了Thread-1" , 然后通过signal唤醒 , 因为这里只有一个 "Thread-0" 线程阻塞所以直接唤醒 "Thread-0" , 最后输出 "aa方法结束了Thread-0" 执行完毕 。
ReentrantReadWriteLockReentrantReadWriteLock 是一种特殊的 Lock实现类 , 它除了可以实现上面提到的所有功能外 , 还能实现 "共享锁" 和 "排他锁"。 它的读锁就是 "共享锁", 写锁是 "排他锁"。
共享锁共享锁就是不同线程可以同时执行 , 相当于没有加锁 。 那么问题来了 , 既然多线程可以同时获取共享锁 , 那么共享锁的意义是什么呢?答案就是为了和 "排他锁" 互斥 。 下面先看 ReentrantReadWriteLock 共享锁的例子 。
1 public class Test { 2private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); 34public static void main(String[] args){ 5final Test test = new Test(); 6new Thread(){ 7public void run() { 8test.get(Thread.currentThread()); 9};10}.start();11new Thread(){12public void run() {13test.get(Thread.currentThread());14};15}.start();16}17public void get(Thread thread) {18rwl.readLock().lock();19try {20long start = System.currentTimeMillis();21while(System.currentTimeMillis() - start <= 1) {22System.out.println(thread.getName()+"正在进行读操作");23}24System.out.println(thread.getName()+"读操作完毕");25} finally {26rwl.readLock().unlock();27}28}29 }
结果:
文章插图
可以看到 , 在调用 readLock的lock()方法后 , 两个线程依然能交叉执行 , 这就是共享锁的特点
排它锁排它锁就是我们常见的锁 , 同一时间锁资源只能被一个线程所占用 , 它和 "共享锁" 是互斥关系 。 下面还是以上面的代码改成 "写锁"试试 。
1 public class Test { 2private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); 34public static void main(String[] args){ 5final Test test = new Test(); 6new Thread(){ 7public void run() { 8test.get(Thread.currentThread()); 9};10}.start();11new Thread(){12public void run() {13test.get(Thread.currentThread());14};15}.start();16}17public void get(Thread thread) {18rwl.writeLock().lock();19try {20long start = System.currentTimeMillis();21while(System.currentTimeMillis() - start <= 1) {22System.out.println(thread.getName()+"正在进行写操作");23}24System.out.println(thread.getName()+"写操作完毕");25} finally {26rwl.writeLock().unlock();27}28}29 }
结果:
文章插图
可以看到 , 两个线程是互斥关系 。
为了严谨 , 再比较一下 "读锁" 与 "写锁" 的互斥关系
1 public class Test { 2private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); 34public static void main(String[] args){ 5final Test test = new Test(); 6new Thread(){ 7public void run() { 8test.getWrite(Thread.currentThread()); 9};10}.start();11new Thread(){12public void run() {13test.getRead(Thread.currentThread());14};15}.start();16}17public void getWrite(Thread thread) {18rwl.writeLock().lock();19try {20long start = System.currentTimeMillis();21while(System.currentTimeMillis() - start
- 华为畅享20se和红米note9哪个好区别在哪 参数对比评测
- 荣耀v40pro对比vivox60pro哪个好区别在哪 性能谁更强
- realmev15和realmev3区别参数对比 哪个好性价比高
- 红米k40pro和荣耀30区别哪个好 不同点对比参数配置谁好
- iqoo7和红米k30至尊纪念版哪个好区别在哪 参数对比评测
- 小米11和红米k30pro哪个好性价比高 参数配置对比区别
- 华为nova8与小米10对比哪个好 参数配置区别性能评测
- 「小狮子诊所」游戏耳机和音乐耳机究竟有什么区别?
- 荣耀v40和华为p40对比哪个好 参数配置区别性能谁更强
- 小米11和华为p40pro哪个好区别在哪 参数优缺点对比评测