一、前言

最近刚读完一本书:《Netty、Zookeeper、Redis 并发实战》,个人觉得 Netty 部分是写得很不错的,读完之后又对 Netty 进行了一波很好的复习(之前用 spring boot + netty + zookeeper 模仿 dubbo 做 rpc 框架,那时候是刚学 netty 后自己造的小轮子)。

虽然对于 Netty 的使用已经比较熟悉了,而且还知道它的底层是基于 Java NIO 做进一步的封装,使得并发性能和开发效率得到大大的提升。但是,对于同步阻塞、同步非阻塞、异步这些概念,还是比较的模糊,一直处于似懂非懂的状态。

所以这两天,一直在网上看看大家对此的评论,也得到了一些启发。而且还有很多同学们提到了 《Netty 权威指南 第二版》 这本书,说前两章对于网络 I/O 模型和 Java I/O 的介绍很不错,所以我也特意去找了一本 pdf 来看看(比较穷。。。)。看了前两章后,确实对于这方面的概念清晰了不少,所以决定写下此文章来记录一下,也分享给更多不清楚这方面理论的同学们,并且也下定决定,有空一定把这本书继续看完,哈哈哈。

1 什么是自旋锁和互斥锁?

由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么?

自旋锁说白了也是一种互斥锁,只不过没有抢到锁的线程会一直自旋等待锁的释放,处于busy-waiting的状态,此时等待锁的线程不会进入休眠状态,而是一直忙等待浪费CPU周期。因此自旋锁适用于锁占用时间短的场合。

这里谈到了自旋锁,那么我们也顺便说下互斥锁。这里的互斥锁说的是传统意义的互斥锁,就是多个线程并发竞争锁的时候,没有抢到锁的线程会进入休眠状态即sleep-waiting,当锁被释放的时候,处于休眠状态的一个线程会再次获取到锁。缺点就是这一些列过程需要线程切换,需要执行很多CPU指令,同样需要时间。如果CPU执行线程切换的时间比锁占用的时间还长,那么可能还不如使用自旋锁。因此互斥锁适用于锁占用时间长的场合。

2 什么是CLH锁?

CLH锁其实就是一种是基于逻辑队列非线程饥饿的一种自旋公平锁,由于是 Craig、Landin 和 Hagersten三位大佬的发明,因此命名为CLH锁。

CLH锁原理如下:

  1. 首先有一个尾节点指针,通过这个尾结点指针来构建等待线程的逻辑队列,因此能确保线程线程先到先服务的公平性,因此尾指针可以说是构建逻辑队列的桥梁;此外这个尾节点指针是原子引用类型,避免了多线程并发操作的线程安全性问题;
  2. 通过等待锁的每个线程在自己的某个变量上自旋等待,这个变量将由前一个线程写入。由于某个线程获取锁操作时总是通过尾节点指针获取到前一线程写入的变量,而尾节点指针又是原子引用类型,因此确保了这个变量获取出来总是线程安全的。

这么说肯定很抽象,有些小伙伴可能不理解,没关系,我们心中可以有个概念即可,后面我们会一步一图来彻彻底底把CLH锁弄明白。

3 为什么要学习CLH锁?

好了,前面我们对CLH锁有了一个概念后,那么我们为什么要学习CLH锁呢?

研究过AQS源码的小伙伴们应该知道,AQS是JUC的核心,而CLH锁又是AQS的基础,说核心也不为过,因为AQS就是用了变种的CLH锁。如果要学好Java并发编程,那么必定要学好JUC;学好JUC,必定要先学好AQS;学好AQS,那么必定先学好CLH。因此,这就是我们为什么要学习CLH锁的原因。

最后

送大家一个小福利,点击领取Java全套进阶资料

[外链图片转存中…(img-UYnpGDE5-1624095793543)]

java老版手机游戏合集破解相关推荐

  1. java老版手机游戏剑魂_剑魂自动训练第3部分

    java老版手机游戏剑魂 In this article, we will finally put an end to the "Automating Swords & Souls& ...

  2. 太厉害了!java老版手机游戏下载

    1.为什么要使用消息队列? 分析:一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景(不可否认还有其他的,但是只答三 ...

  3. java老版手机游戏下载,完整PDF

    8-22 投递简历 8-24 一面(大概1h50min) 0.currenthashmap怎么扩容的?fwn为什么固定hash -1,这样设计有什么好处?帮助扩容是发生在什么阶段?读线程和写线程都会帮 ...

  4. 【Java十大热门游戏合集】Java经典游戏项目

    家人们,今天我们来看一下学Java必练的10款游戏项目! 大家都知道学习编程必须要做的就是敲代码和做项目练手了,那项目有难有易,很多小伙伴不知道从哪里找项目来练习,今日我们来看一下初级项目中都有哪些能 ...

  5. 【Java十大热门游戏合集】Java经典游戏项目(附源码课件

    家人们,我又来啦,今天我们来看一下学Java必练的10款游戏项目! 大家都知道学习编程必须要做的就是敲代码和做项目练手了,那项目有难有易,很多小伙伴不知道从哪里找项目来练习,今日我们来看一下初级项目中 ...

  6. Java、Python小游戏合集

    Java源码及图片素材合集 Java包括:飞机大战.经典斗兽棋(有过河的那种).五子棋.俄罗斯方块.国际象棋.吃豆人.推箱子(只有5关).扫雷.贪吃蛇.坦克大战.2048等11个小游戏 Python源 ...

  7. 手机单机游戏合集大概40个G

    上次分享电脑单机游戏合集收到了很多朋友的回复,今天转载神坛发的手机游戏合集.我才知道饥荒有手机版 全是安卓的(苹果的要越狱或者免越狱这个比较麻烦:而且破解软件比较少:所以不关注苹果:)     因为是 ...

  8. 最全小霸王游戏合集-新

    前言 提示:这里可以添加本文要记录的大概内容: 如何证明你有童年?看看下边的游戏你见过几个? 禁止打广告,谢谢! 电脑打开既玩,不需要安装模拟器,手柄有无都可以. 有需要回顾童年的关注公众号" ...

  9. dreamcast游戏_Dreamcast Collection游戏百度网盘下载-DC游戏合集下载PC硬盘版-西西游戏下载...

    <DC游戏合集>(Dreamcast Collection)收录了六款经典DC游戏,分别是<音速小子大冒险(Sonic Adventure)>.<疯狂计程车(Crazy ...

最新文章

  1. html css web笔记,Web/HTML/CSS/的笔记
  2. boost::range模块tokenized相关的测试程序
  3. oracle insert into values select from,ORACLE语法中的INSERT INTO。。。SELECT。。。 收藏
  4. Java:伪造工厂的闭包以创建域对象
  5. python模拟购物车购物过程_Python 模拟购物车的实例讲解
  6. CSS中的resize属性
  7. Wannafly挑战赛23 A 字符串
  8. 如何让我们的VMware虚拟机上网——转载
  9. 踏雪寻梅 —— 日志打印
  10. TCP和UDP协议的特点和区别详解
  11. HDOJ-1272 小希的迷宫
  12. 「 机器人学 」机器人与控制工程基础浅谈
  13. 安装与配置VMware虚拟机 https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
  14. go语言 gin框架中集成zap日志库
  15. Laravel Excel实现Excel/CSV文件导入导出的功能详解(合并单元格,设置单元格样式)
  16. Linux 下如何进入 MySQL 命令行
  17. Java判断一个序列是否可由给定序列通过栈操作获得(ABCDEF)
  18. OIM Training Lab 1
  19. 什么是外键,外键的作用
  20. 开源作品——CMSIS-DAP调试器

热门文章

  1. UI设计师需要学习哪些技能?
  2. php免费翻译接口,免费的翻译接口用不起不要太爽啊!
  3. 情人节主题微信红包封面序列号免费领取!
  4. Mikrotik RouterOS-脚本-花生壳动态域名解析
  5. 关闭不断输出的batch acquisition of 0 triggers
  6. 优酷上线优酷号短视频自媒体平台!
  7. CXM百科 | 那些年我们做过的问卷题——评分量表题
  8. 香侬读 | 让预训练模型学习知识:使用多学习器增强知识建模能力
  9. 微信小程序自定义输入仿咸鱼发布
  10. Python爬虫入门 | 4 爬取豆瓣TOP250图书信息