死磕 java同步系列之开篇
简介
同步系列,这是彤哥想了好久的名字,本来是准备写锁相关的内容,但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁,它们和锁又有很多共同点,都是为了协同多线程的执行,都是一种同步器,所以这里就借用同步来取名字了,也就是“同步系列”的来源。
概览
这一篇的内容会比较多,大致包含三大主题:java中的锁、同步器、分布式锁,大致讲的内容如下:
(1)volatile
(2)synchronized
(3)AQS及Condition
(4)ReentrantLock
(5)ReentrantReadWriteLock
(6)StampedLock
(7)CountDownLatch
(8)Semaphore
(9)CyclicBarrier
(10)Phaser
(11)Mysql实现分布式锁
(12)Redis实现分布式锁
(13)Zookeeper实现分布锁
这些内容都比较晦涩难懂,网上也有比较多的资料,但往往讲得不够透彻,彤哥会尽量用通俗易懂的语言把这些问题讲清楚。
名词解释
关于锁的名词也有很多,彤哥大致整理了下,全部列到这里:
(1)公平锁/非公平锁
公平锁,是指按照线程申请的顺序获取锁。
非公平锁,是指不是按照线程申请的顺序获取锁,有可能后申请的线程反而先获取到锁,假如先来的线程一直获取不到锁,会造成锁饥饿现象。
ReentrantLock中可以通过构造方法指定是否为公平锁,默认为非公平锁,非公平锁的优点在于吞吐量大。
synchronized无法指定为公平锁,一直都是非公平锁。
(2)可重入锁
可重入锁,是指一个线程获取锁之后再尝试获取锁时会自动获取锁,可重入锁的优点是避免死锁。
ReentrantLock和synchronized都是可重入锁。
(3)独享锁/共享锁
独享锁,是指锁一次只能被一个线程持有。
共享锁,是指锁一次可以被多个线程持有。
ReentrantLock和synchronized都是独享锁,ReadWriteLock的读锁是共享锁,写锁是独享锁。
(4)互斥锁/读写锁
与独享锁/共享锁的概念差不多,是独享锁/共享锁的具体实现。
ReentrantLock和synchronized都是互斥锁
ReadWriteLock是读写锁
(5)乐观锁/悲观锁
悲观锁,是指认为对于同一个数据的并发操作必然会发生修改,即使不会发生修改也这么认为,所以一定要加锁。
乐观锁,是指认为对于同一个数据的并发操作不一定会发生修改,在更新数据的时候,尝试去更新数据,如果失败就不断尝试。
悲观锁适用于写操作多的场景,乐观锁适用于读操作多的场景。
(6)分段锁
分段锁,是一种锁的设计思路,它细化了锁的粒度,主要运用在ConcurrentHashMap中,实现高效的并发操作,当操作不需要更新整个数组时,就只锁数组中的一项就可以了。
(7)偏向锁/轻量级锁/重量级锁
这三个锁主要是针对synchronized进行优化使用的,主要是通过对象监视器在对象头中的字段来表明的。
偏向锁,是指一段同步代码一直被一个线程访问,那么这个线程会自动获取锁,降低获取锁的代价。
轻量级锁,是指当锁是偏向锁时,被另一个线程所访问,偏向锁会升级为轻量级锁,这个线程会通过自旋的方式尝试获取锁,不会阻塞,提高性能。
重量级锁,是指当锁是轻量级锁时,当自旋的线程自旋了一定的次数后,还没有获取到锁,就会进入阻塞状态,该锁升级为重量级锁,重量级锁会使其他线程阻塞,性能降低。
(8)自旋锁
自旋锁,是指尝试获取锁的线程不会阻塞,而是循环的方式不断尝试,这样的好处是减少线程的上下文切换带来的开锁,提高性能,缺点是循环会消耗CPU。
(9)监视器锁
synchronized的实现方式,使用monitorenter和monitorexit来实现。
(10)mutex锁
互斥锁,LockSupport.part()底层是通过mutex实现的。
彩蛋
招募令:
因为彤哥本身工作也比较繁忙,很难做到日更,所以这里诚邀广大好友积极投稿,大家一起学习一起进步。
可在公众号后台给我留言“投稿”,互加好友详细讨论投稿内容。
当然,其它问题也可在公众号后台留言,不管是生活上、工作上、心理上还是身体上的,欢迎叨扰,留言必回。
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【大数据】SparkSql连接查询中的谓词下推处理(一)
本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/YPN85WBNcnhk8xKjTPTa2g 作者:李勇 目录: 1.SparkSql 2.连接查询和连接条件 3.谓词下推 4.内连接查询中的谓词下推规则 4.1.Join后条件通过AND连接 4.2.Join后条件通过OR连接 4.3.分区表使用OR连接过滤条件 1.SparkSql SparkSql 是架构在 Spark 计算框架之上的分布式 Sql 引擎,使用 DataFrame 和 DataSet 承载结构化和半结构化数据来实现数据复杂查询处理,提供的 DSL可以直接使用 scala 语言完成 Sql 查询,同时也使用 thriftserver 提供服务化的 Sql 查询功能。 SparkSql 提供了 DataSource API ,用户通过这套 API 可以自己开发一套 Connector,直接查询各类数据源,数据源包括 NoSql、RDBMS、搜索引擎以及 HDFS 等分布式文件系统上的文件等。和 SparkSql 类似的系统有 Hive、PrestoDB 以及 Impal...
- 下一篇
千万并发不是梦:TCPBurn并发测试
王斌 TCPCopy和Cetus开源主要作者 知识星球ID: 47406575,提供TCP经典案例分析课程 微信公众号:得一技术 “黑云压城城欲摧,甲光向日金鳞开”,唐朝诗人李贺字面上描绘了黑云压城的自然景象,但实际描述的是敌军攻占城池的人马众多,来势汹汹,但是守城士兵依旧严阵以待,斗志昂扬。这种攻守的战争场面,和服务器的高并发压测十分相似。待压测的服务器应用类似于待攻占的城池,而测试软件需要做的就是构造出成千上百万的士兵,来攻占服务器的应用。 如何构造出成千上百万的攻城士兵,是高并发测试的关键。而传统压力测试工具设计的时候并不是针对高并发测试设计的。针对高并发场景,传统压力测试工具往往自身是性能瓶颈。为适应高并发趋势,我们设计了TCPBurn,用于无状态协议的高并发压力测试,瞬间可以创造出任意多的攻城的精兵猛将。 我们以消息推送服务为例,来模拟海量用户并发场景。千万并发连接测试相关的公开资料很少,据说要达到C10M(千万连接)并发,需要从根本上解决内核自身的问题。我们的实验希望验证linux服务器环境下Nginx能否承受千万连接的考验。 1、软硬件配置 为进行千万并发...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题