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

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

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

下面来执行一下:

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

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

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

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

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

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

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

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

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

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

Java精通并发-Lock与synchronized关键字在底层的区别及实例分析的更多相关文章

  1. Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】

    自旋对于synchronized关键字的底层意义与价值分析: 对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述 ...

  2. Java 多线程并发编程之 Synchronized 关键字

    synchronized 关键字解析 同步锁依赖于对象,每个对象都有一个同步锁. 现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的 ...

  3. Java精通并发-Lock锁机制深入详解

    从这次开始接触Java1.5推出的并发包中的东东,先看一下jdk中的并发包: 接下来咱们则会集中对这些并发包中的核心进行深入了解,不光要学会怎么用这些并发包中的类,而且还得知道这些功能背后运行的原理, ...

  4. Java精通并发-Lock锁方法原理详解

    继续上一次https://www.cnblogs.com/webor2006/p/11756563.html的Lock文档说明进行阅读: 以上就是对于Lock类中官方解读,下面再纵览一下它里面的方法: ...

  5. Java精通并发-notify方法详解及线程获取锁的方式分析

    wait(): 在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读,而它是调用了一个参数 ...

  6. Java精通并发-透过字节码理解synchronized关键字

    在上一次https://www.cnblogs.com/webor2006/p/11428408.html中对于synchronized关键字的作用做了一个实例详解,下面再来看一下这个程序: 请问下, ...

  7. Java精通并发-synchronized关键字原理详解

    关于synchronized关键字原理其实在当时JVM的学习[https://www.cnblogs.com/webor2006/p/9595300.html]中已经剖析过了,这里从研究并发专题的角度 ...

  8. Java精通并发-同步方法访问标志与synchronized关键字之间的关系

    继续基于上一次https://www.cnblogs.com/webor2006/p/11428811.html来研究synchronized关键字在字节码中的表现,在上一次文末提出了一个这样的问题: ...

  9. Java并发编程之synchronized关键字

    整理一下synchronized关键字相关的知识点. 在多线程并发编程中synchronized扮演着相当重要的角色,synchronized关键字是用来控制线程同步的,可以保证在同一个时刻,只有一个 ...

随机推荐

  1. 2018-2019-2 20165313 《网络对抗技术》 Exp 8 Web基础

    一.实践要求: (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2).Web前端javascip ...

  2. EmotiW 历年竞赛冠军数据及论文信息

    date Baseline paper Champion paper Model & Feature Test_acc 2013 [1] [2] EmoNets 41.03 2014 [3] ...

  3. WebStorm ------------ 调整字体大小和背景

    WebStorm  一款前端编写工具,使用方式与idea 相似 如何调整字体大小 在设置里面找 设置编码背景 拷贝一个样式,,在此样式下进行更改 开始设置 设置好后 dd

  4. 彻底解决springboot修改页面和代码会自动重启

    3.application.yml配置 spring.devtools.restart.enabled=falsespring.thymeleaf.cache=false 1.解决thymeleaf修 ...

  5. 螺旋折线-C++

    标题:螺旋折线 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0, ...

  6. java基础 super和this

    /** * super关键字的用法有三种: * 1.在子类的成员方法中,访问父类的成员变量 * 2.在子类的成员方法中,访问父类的成员方法 * 3.在子类的构造方法中,访问父类的构造方法 * * th ...

  7. person类与其子类在使用中的内存情况(含java的改写和c#的屏蔽)

    JAVA 普通person类及调用代码: public class Person { public String xm; public int nl; public void setme(String ...

  8. Tigase XMPP Server

    Tigase XMPP Server是我们的旗舰服务器端软件,提供XMPP服务或实例通信(IC)服务.最基本的解释是Tigase是一个聊天服务器,但它远不止于此.聊天是其可能的应用程序之一,但任何类型 ...

  9. python基础流程控制

    流程控制主要分为三大类: 1.if 判断语句 2.while 循坏语句 3.for 循坏语句 下面以举例说明: if 判断语句: user1 = 'seven' user2 = 'alex' pass ...

  10. kylin2.4.1订单案例详细构建流程

    一.Hive订单数据仓库构建: hive表创建可以在命令行中直接完成,也可以在Hue中完成,本文在Hue中的完成,如下图: 下文的样例文本文件下载地址:https://files-cdn.cnblog ...