Java并发包下锁学习第一篇:介绍及学习安排

在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁。从今天起,凯哥将带领大家一起豪华参观(详细讲解)在Java并发包(JUC)下locks包下的体系结构。

在这个系列中,我们将会学习并发包下锁实现的原理(我们将跟着源码来分析)、什么是可重入锁、公平锁和非公平锁怎么定义的、为什么synchronized关键字的锁和ReentrantLock默认会选择非公平锁?读写锁和独占锁的比较、跟着源码我们来分析读写锁等和锁相关的知识。学完这个系列教程后,大家将对并发锁有更新的理解,欢迎大家一起学习。

本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第一篇:《Java并发包下锁学习第一篇》

本文主要内容:java中锁定义及在jdk5以后的并发包(JUC)下锁相关的类及类关系图;怎么学习JUC下锁

凯哥讲解一般步骤:先举生活中的例子,然后从例子中总结,然后在用代码演示。经过这三个步骤来加深大家的印象。

一:锁的理解

在多线程场景下,多个线程要操作同一个资源,这个被竞争的资源就是共享资源。当同时有多个线程一起竞争共享资源的时候,如果一个线程竞争到了这个资源,就需要使用一个手段或者是技术通知其他线程,这个资源已经被占用着,其他线程需要等待才可以。基于这种思想,在我们现实生活中,如何让其他人知道某个东西是你的呢?贴上你的名字、打上标识或者是用一把锁锁着。这样别人就竞争不了了。锁就是这个通知其他人(或线程)的一种手段。所以,在多线程环境下,就是用了这种技术来实现对共享资源的控制。

二:JUC下locks包下体系

我们先来看看JUC下的locks包都有哪些类或接口。

JUC包下锁相关的类:

上图中类之间的关系可以简单如下图:

锁之间类图关系:

更简单明了的如下图:

三:类介绍

AbstractOwnableSynchronizer:队列同步器。

该类是用来构建锁或者其他同步组件的基础框架的顶级抽象类。有两个子类

AbstractQueuedLongSynchronizer:是AbstractQueuedSynchronizer类的另一个版本类。区别就在原AbstractQueuedLongSynchronizer类里面状态码使用Long类型的而非int类型的。凯哥在以后文章中将详细介绍AbstractQueuedSynchronizer类的。

AbstractQueuedSynchronizer:队列同步器。

使用比较多的。是构建锁或者其他同步组建的基础框架。其通过一个int成员变量来表示同步状态的。通过内部类Node来实现FIFO(first-in-first-out:即先进先出)的队列来完成获取资源线程排队的操作。

Lock:

排他锁的顶级接口。

RenntrantLock:

Lock的实现类。可重入锁。内部有公平锁和非公平锁两个内部类。

ReadWriteLock:

读写锁的顶级接口

ReentrantReadWriteLock:

读写锁的子类。内部有读锁和写锁两个内部类来控制着读写分离操作的。

LockSupport:

当要执行阻塞或者是唤醒一个线程的时候,都会使用到lockSupport这个工具类来实现的。

Condition:

监视对象。与lock对象配合使用来实现等待/通知模式

四:学习安排

通过上面介绍我们对并发包下的locks包有所了解了。在接下来的学习中,我们将会按照上面类介绍的顺序来学习。先学习同步队列,跟着源码来分析主要API;在学习排他锁;然后再学习读写锁;最后学习后面两个类。

Java并发包下锁学习第一篇:介绍及学习安排的更多相关文章

  1. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  2. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  3. JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇

    JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇 作为一个使用Java语言开发的程序员,我们都知道,要想运行Java程序至少需要安装JRE(安装JDK也没问题).我们也知道我们Java程序 ...

  4. Python学习第一篇

    好久没有来博客园了,今天开始写自己学习Python和Hadoop的学习笔记吧.今天写第一篇,Python学习,其他的环境部署都不说了,可以参考其他的博客. 今天根据MachineLearning里面的 ...

  5. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  6. spring cloud系列教程第一篇-介绍

    spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...

  7. Golang学习-第一篇 Golang的简单介绍及Windows环境下安装、部署

    序言 这是本人博客园第一篇文章,写的不到位之处,希望各位看客们谅解. 本人一直从事.NET的开发工作,最近在学习Golang,所以想着之前学习的过程中都没怎么好好的将学习过程记录下来.深感惋惜! 现在 ...

  8. Java图像处理最快技术:ImageJ 学习第一篇

    ImageJ是世界上最快的纯Java的图像处理程序. 它能够过滤一个2048x2048的图像在0.1秒内(*). 这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Ima ...

  9. ImageJ 学习第一篇

    ImageJ是世界上最快的纯Java的图像处理程序.它可以过滤一个2048x2048的图像在0.1秒内(*).这是每秒40万像素!ImageJ的扩展通过使用内置的文本编辑器和Java编译器的Image ...

随机推荐

  1. JAVA:初识Java · Xer97

    1. 什么是Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. Java语言作为静 ...

  2. 自动化测试ROI实践

    自动化测试是一项"一旦开始,就需要持续投入"的工作,所以它一直是测试领域的一块鸡肋.不做吧,好像手工测试重复得让人有些厌倦,而且手工测试时间也缩短不了.做吧,害怕投入的比回报要多. ...

  3. 【转载】(String)、toString、String.valueOf的区别

    用于个人参考,查看请前往原地址http://blog.csdn.net/springk/article/details/6414017 问题讨论http://bbs.csdn.net/topics/2 ...

  4. 手写实现vue的MVVM响应式原理

    文中应用到的数据名词: MVVM   ------------------        视图-----模型----视图模型                三者与 Vue 的对应:view 对应 te ...

  5. H5新增特性之语义化标签

    H5新增特性之语义化标签 语义化标签顾名思义标签有自己的含义,浏览器或者程序员一看就知道是什么.在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式 ...

  6. Pom.xml的依赖自动生成

    1.第一种用引入jar包的方法 网盘链接:https://pan.baidu.com/s/10HNjNeZc1d5QrFNtvLPWBA 提取码:oako 以上是整个文件直接用idea打开即可 imp ...

  7. window.showModalDialog与window.open()使用

    window.showModalDialog 有些浏览器不兼容,尝试用window.open() 封装替代,需要打开子窗口后向父窗口传递数据. <html> <script src= ...

  8. Subsequence POJ - 3061

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22040   Accepted: 9404 Desc ...

  9. 2019-2020-2 20175226 王鹏雲 网络对抗技术 Exp2 后门原理与实践

    2019-2020-2 20175226 王鹏雲 网络对抗技术 Exp2 后门原理与实践 实验内容 使用netcat获取主机操作Shell,cron启动: 使用socat获取主机操作Shell, 任务 ...

  10. 2020年ubuntu sever1804 安装和配置

    最后一次折腾linux服务器,应该是13的我的VPS.因为转行后,没有及时关注vps续费的问题,结果过期,所有的数据丢失了 当时觉得,反正都不做了,丢了就丢了吧,可现在想起来,实在是太后悔了. 今天, ...