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

时间:2022-09-23 09:17:25

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

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

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

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

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

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

一:锁的理解

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

二:JUC下locks包下体系

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

JUC包下锁相关的类:

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

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

锁之间类图关系:

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

更简单明了的如下图:

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

三:类介绍

AbstractOwnableSynchronizer:队列同步器。

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

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

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

AbstractQueuedSynchronizer:队列同步器。

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

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

Lock:

排他锁的*接口。

RenntrantLock:

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

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

ReadWriteLock:

读写锁的*接口

ReentrantReadWriteLock:

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

LockSupport:

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

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

Condition:

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

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

四:学习安排

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

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

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. SQL Server 致程序员(容易忽略的错误)

    标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...

  2. webform:图片水印、验证码制作

    一.图片水印 1:引命名空间System.Drawing; 前端代码 <div> <asp:FileUpload ID="FileUpload1" runat=& ...

  3. 启动Mysql服务提示Can’t connect to local MySQL server through socket的解决方法

    启动Mysql服务常会提示下面错误: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/ ...

  4. 安装mysql后ERROR 2002 &lpar;HY000&rpar;&colon; Can’t connect to local MySQL server through socket &OpenCurlyQuote;&sol;var mysql 启动不了

    ps -A | grep -i mysql kill 列出来的进程 service mysql start 我的问题就解决了 ------------------------------------- ...

  5. SQL Server 2008 R2 主从数据库同步设置

    一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...

  6. a标签链接到当前页内指定位置

    <a name="me">hello</a><br/><br/><br/><br/><br/>& ...

  7. Servlet编程实例2

    上次实验中利用HttpServletRespon.sendRedict()方法来实现页面的转跳,而这种重定向请求的方法无法传递缓存的内容. 所以为了做出改进,这次使用RequestDispatcher ...

  8. 使用limit查询的同时取得总的记录数:SQL&lowbar;CALC&lowbar;FOUND&lowbar;ROWS和FOUND&lowbar;ROWS&lpar;&rpar;

    通常我们都用如下的sql来进行列表 SELECT COUNT(*) FROM users WHERE name LIKE 'a%';SELECT name, email FROM users WHER ...

  9. Web版记账本开发记录(一)

    //index.js var util = require("../../utils/util.js"); //获取应用实例 var app = getApp(); Page({ ...

  10. 【2017下集美大学软工1412班&lowbar;助教博客】个人作业2——APP案例分析

    作业要求 个人作业2:APP案例分析 评分结果 按从高到低排列 学号后三位 第二次作业 Total 008 APP案例分析 23 044 第2次作业 19.5 011 App案例分析--XBMC 19 ...