zoukankan      html  css  js  c++  java
  • Java精通并发-Lock与synchronized关键字在底层的区别及实例分析

    在上两次中已经将Lock这个接口的整个官方说明进行了阅读,这次来了解一下它的一个非常重要的实现类:

    啥叫“可重入”呢?其实是指一个线程已经拿到了锁,然后该线程还能再次获取这把锁,接下来在了解它之前先用一下该锁,如下:

    然后接一来线程分别来调用定义的两个方法,如下:

    下面来执行一下:

    也就是线程交替地在执行,很容易理解,那如果下面修改一下代码:

    那结果又是咋样呢?肯定会发生阻塞的情况,因为用了锁木有解锁嘛,运行一下:

    也很好理解嘛,由于两个方法都要用同一个锁:

    那当线程执行了myMethod1之后抢到锁就永远不会释放了,那myMethod2就永远获取不到了,则输出就可以预想了。接下来继续来改造一下程序:

    此时当阻塞的时候我们可以用tryLock来判断出来实际状态,这样就不会一直尝试阻塞了,如果获取不了立马就返回然后程序就可以给出提示了。

    以上是对于Lock的一个简单使用,下面咱们对Lock与synchronized关健字在锁的处理上的重要差别进行梳理一下:

    1、锁的获取方法:前者是通过程序代码的方式由开发者手工获取,后者是通过JVM来获取(无需开发者干预)。

    2、具体实现方法:前者是通过Java代码的方式来实现,后者是通过JVM底层来实现(无需开发者关注)。

    3、锁的释放方法:前者务必通过unlock()方法在finally块中手工释放,后者是通过JVM来释放(无需开发者关注)。

    4、锁的具体类型:前者提供了多种,如公平锁、非公平锁,后者与前者均提供了可重入锁。其中公平锁和非公平锁在ReentrantLock源码中看到身影:

  • 相关阅读:
    Flask 开启跨域
    pandas to dict
    mongodb 聚合查询
    flask 获取请求参数
    CSS dppx详解
    用CSS做出漂亮的字体动画
    VMware虚拟主机安装完成后连接不上网络
    wokerman中自定义协议的使用和测试
    使用workerman写一个小的聊天室
    telnet不能使用怎么办?
  • 原文地址:https://www.cnblogs.com/webor2006/p/11792954.html
Copyright © 2011-2022 走看看