diff --git a/docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md b/docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md index b6f40fbc..00aaecd8 100644 --- a/docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md +++ b/docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md @@ -1,3 +1,22 @@ +点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 + + + +- [何谓悲观锁与乐观锁](#何谓悲观锁与乐观锁) + - [悲观锁](#悲观锁) + - [乐观锁](#乐观锁) + - [两种锁的使用场景](#两种锁的使用场景) +- [乐观锁常见的两种实现方式](#乐观锁常见的两种实现方式) + - [1. 版本号机制](#1-版本号机制) + - [2. CAS算法](#2-cas算法) +- [乐观锁的缺点](#乐观锁的缺点) + - [1 ABA 问题](#1-aba-问题) + - [2 循环时间长开销大](#2-循环时间长开销大) + - [3 只能保证一个共享变量的原子操作](#3-只能保证一个共享变量的原子操作) +- [CAS与synchronized的使用情景](#cas与synchronized的使用情景) + + + ### 何谓悲观锁与乐观锁 > 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。 @@ -64,8 +83,6 @@ JDK 1.5 以后的 `AtomicStampedReference 类`就提供了此种能力,其中 CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效。但是从 JDK 1.5开始,提供了`AtomicReference类`来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行 CAS 操作.所以我们可以使用锁或者利用`AtomicReference类`把多个共享变量合并成一个共享变量来操作。 - - ### CAS与synchronized的使用情景 > **简单的来说CAS适用于写比较少的情况下(多读场景,冲突一般较少),synchronized适用于写比较多的情况下(多写场景,冲突一般较多)** @@ -73,10 +90,17 @@ CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 1. 对于资源竞争较少(线程冲突较轻)的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源;而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。 2. 对于资源竞争严重(线程冲突严重)的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized。 - 补充: Java并发编程这个领域中synchronized关键字一直都是元老级的角色,很久之前很多人都会称它为 **“重量级锁”** 。但是,在JavaSE 1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的 **偏向锁** 和 **轻量级锁** 以及其它**各种优化**之后变得在某些情况下并不是那么重了。synchronized的底层实现主要依靠 **Lock-Free** 的队列,基本思路是 **自旋后阻塞**,**竞争切换后继续竞争锁**,**稍微牺牲了公平性,但获得了高吞吐量**。在线程冲突较少的情况下,可以获得和CAS类似的性能;而线程冲突严重的情况下,性能远高于CAS。 - +## 公众号 + +如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 + +**《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"面试突击"** 即可免费领取! + +**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 + +![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) diff --git a/docs/java/J2EE基础知识.md b/docs/java/J2EE基础知识.md index 4d70e1c1..fc9fac22 100644 --- a/docs/java/J2EE基础知识.md +++ b/docs/java/J2EE基础知识.md @@ -1,3 +1,5 @@ +点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 + - [Servlet总结](#servlet总结) diff --git a/docs/java/Java IO与NIO.md b/docs/java/Java IO与NIO.md index 905df527..74bd850e 100644 --- a/docs/java/Java IO与NIO.md +++ b/docs/java/Java IO与NIO.md @@ -27,12 +27,12 @@ **(1) 按操作方式分类结构图:** -![按操作方式分类结构图:](https://user-gold-cdn.xitu.io/2018/5/16/16367d4fd1ce1b46?w=720&h=1080&f=jpeg&s=69522) +![IO-操作方式分类](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/IO-操作方式分类.png) **(2)按操作对象分类结构图** -![按操作对象分类结构图](https://user-gold-cdn.xitu.io/2018/5/16/16367d673b0e268d?w=720&h=535&f=jpeg&s=46081) +![IO-操作对象分类](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/IO-操作对象分类.png) ### [二 java IO体系的学习总结](https://blog.csdn.net/nightcurtis/article/details/51324105) 1. **IO流的分类:** @@ -92,7 +92,7 @@ - 写入数据到缓冲区(Writing Data to a Buffer) **写数据到Buffer有两种方法:** - + 1.从Channel中写数据到Buffer ```java int bytesRead = inChannel.read(buf); //read into buffer. @@ -103,7 +103,7 @@ ``` 4. **Buffer常用方法测试** - + 说实话,NIO编程真的难,通过后面这个测试例子,你可能才能勉强理解前面说的Buffer方法的作用。 diff --git a/docs/java/Java基础知识.md b/docs/java/Java基础知识.md index 7e79094e..1711f2fe 100644 --- a/docs/java/Java基础知识.md +++ b/docs/java/Java基础知识.md @@ -1,3 +1,5 @@ +点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 + - [1. 面向对象和面向过程的区别](#1-面向对象和面向过程的区别) diff --git a/docs/java/Java编程规范.md b/docs/java/Java编程规范.md index 0845c21b..00c70a8a 100644 --- a/docs/java/Java编程规范.md +++ b/docs/java/Java编程规范.md @@ -1,5 +1,3 @@ - - 根据各位建议加上了这部分内容,我暂时只是给出了两个资源,后续可能会对重要的点进行总结,然后更新在这里,如果你总结过这类东西,欢迎与我联系! ### 团队 diff --git a/docs/java/collection/Java集合框架常见面试题.md b/docs/java/collection/Java集合框架常见面试题.md index 57286ead..550053bc 100644 --- a/docs/java/collection/Java集合框架常见面试题.md +++ b/docs/java/collection/Java集合框架常见面试题.md @@ -1,3 +1,5 @@ +点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 + - [剖析面试最常见问题之Java基础知识](#剖析面试最常见问题之java基础知识)