简介

同步系列,这是彤哥想了好久的名字,本来是准备写锁相关的内容,但是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实现的。

彩蛋

招募令:

因为彤哥本身工作也比较繁忙,很难做到日更,所以这里诚邀广大好友积极投稿,大家一起学习一起进步。

可在公众号后台给我留言“投稿”,互加好友详细讨论投稿内容。

当然,其它问题也可在公众号后台留言,不管是生活上、工作上、心理上还是身体上的,欢迎叨扰,留言必回。

欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。

2019死磕java面试题_死磕 java同步系列之开篇相关推荐

  1. 顺丰java面试题_顺丰java开发面试分享,顺丰java面试经面试题

    今天要给大家分享的是一个小伙伴的顺丰java开发面试过程,其中包括了面试流程,面试题目,和回答,感兴趣的朋友可以来了解一下哈. 一.面试流程 是中午进行的面试,首先是做自我介绍,之后就是讲一下项目,然 ...

  2. 用友java面试题_用友网络科技Java高级开发面试题(2019)

    面试岗位:Java高级开发 面试形式:电话面试 这些天在boss上逛了下,看见北京Java开发工资比较诱人,便萌生了去北京的想法,做一名北漂的程序猿.约了几家面试,由于是异地,当然优先电话面了.本篇记 ...

  3. 用友2020校招java笔试题_用友Java类笔试题大全

    如下为大家汇总的是一份用友Java类笔试题,欢迎大家关注! 1.Hashtable和HashMap有什么区别? a.Hashtable是继承自陈旧的Dictionary类的,HashMap继承自Abs ...

  4. 中级java面试题_最新中级Java面试题及答案

    1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap基于hashing原理,我们通过put()和get()方法 ...

  5. 蘑菇街java面试题_【蘑菇街Java开发工程师面试的问题会有哪些?】-看准网

    面试官是个女生,hr打电话来两天后就开始电话面试了.自我介绍 :大三学生,学习了一年iOS,自己做了两个项目,天气和微博,swift和OC都写. 蘑菇街面经一面: 1,如何用实现微信两人之间发送消息? ...

  6. java面试题35 给定以下JAVA代码,这段代码运行后输出的结果是()

    java面试题35 给定以下JAVA代码,这段代码运行后输出的结果是() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  7. Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持

    Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:(          ) A Java反射主要涉及的类如C ...

  8. 死磕 java同步系列之开篇

    简介 同步系列,这是彤哥想了好久的名字,本来是准备写锁相关的内容,但是java中的CountDownLatch.Semaphore.CyclicBarrier这些类又不属于锁,它们和锁又有很多共同点, ...

  9. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

最新文章

  1. 招青年博士,年薪70-80万,200万以上补贴,直聘博导!苏州大学
  2. AI前沿 | Gartner曲线5大趋势:传感和移动、超能人类、自动机器人、高级人工智能…...
  3. H3C认证无线互联网络专家
  4. Swift-类、结构体、枚举
  5. Linux IO模型
  6. 怎么看笔记本电脑的配置参数_电脑参数怎么看?教你看懂电脑各种配置
  7. matlab hpopup2,matlabpopupmenu的问题
  8. php curl iis,解决IIS运行PHP出现Call to undefined function curl_init()的问题
  9. 2014-12-02-2107-Java-UML
  10. PyInstaller:编译exe与反编译
  11. python爬取网易动态评论
  12. NEC协议红外遥控器
  13. Android studio 虚拟机启动不了Staring AVD
  14. 如何系统的学习linux?
  15. icns文件怎么打开_Mac快速生成icns图标文件 | kTWO-个人博客
  16. win7系统 将 IE11 改为 IE8
  17. 【光学】(一) 光阑、光瞳
  18. mysql timestamp类型格式转换
  19. 数据结构知识点总结整理
  20. 【2D游戏制作笔记】给游戏战斗增加一点打击感

热门文章

  1. 用SQL中的isnull函数注意了
  2. bi导入数据失败 power_主机数据库平台迁移 6 个典型问题
  3. C++类对象成员、动态对象、new、delete运算符申请动态空间(C++初学面向对象)
  4. Python之数据分析(生成动态图像、示波器效果)
  5. Python之网络爬虫(XML与HTML与JSON文件、urllib与request的用法)
  6. Python+django建站入门篇:Hello world
  7. 详解Python切片技术
  8. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性
  9. 多点测试:while的写法
  10. 力扣383.赎金信(JavaScript)