Lock、Synchronized锁区别解析( 六 )
<= 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 <= 1) {22System.out.println(thread.getName()+"正在进行写操作");23}24System.out.println(thread.getName()+"写操作完毕");25} finally {26rwl.writeLock().unlock();27}28}29public void getRead(Thread thread) {30rwl.readLock().lock();31try {32long start = System.currentTimeMillis();33while(System.currentTimeMillis() - start <= 1) {34System.out.println(thread.getName()+"正在进行读操作");35}36System.out.println(thread.getName()+"读操作完毕");37} finally {38rwl.readLock().unlock();39}40}41 }
结果:
文章插图
总结Lock锁 与 synchronized锁 区别
- Lock接口实现的类锁是核心类库中的代码, 是 Java编写的;synchronized 是关键字 , 属于 JVM , 也就是Java原生的 , 使用其他语言实现 。
- Lock实现类锁有更多方法 , 比如可以选择是公平锁还是非公平锁;一段时间获取不到资源可以退出等待队列;以及共享锁排它锁;而后者功能就比较单一了 。
- synchronized 可以修饰静态方法、实例方法、代码块;Lock 实现的锁只能修饰代码块
- synchronized不需要释放锁 , Lock锁需要手动释放 。
- 都可以修饰代码块
- 都是可重入锁
- 效率差不多( jdk1.6优化以后)
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 占营收|华为值多少钱
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- 印度|拒绝华为后,印度、英国斥资数十亿求助日本
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 拍照|iPhone12还没捂热13就曝光了,屏幕、信号、拍照均有升级!
- 路由器|家里无线网经常断网、网速慢怎么办?教你几个小窍门,轻松解决
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型