Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
醒狮指南
JavaGuide
提交
aea1dfb8
J
JavaGuide
项目概览
醒狮指南
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
aea1dfb8
编写于
6月 17, 2019
作者:
S
SnailClimb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update:optimize content
上级
13a7914a
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
37 addition
and
9 deletion
+37
-9
docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md
docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md
+27
-3
docs/java/J2EE基础知识.md
docs/java/J2EE基础知识.md
+2
-0
docs/java/Java IO与NIO.md
docs/java/Java IO与NIO.md
+4
-4
docs/java/Java基础知识.md
docs/java/Java基础知识.md
+2
-0
docs/java/Java编程规范.md
docs/java/Java编程规范.md
+0
-2
docs/java/collection/Java集合框架常见面试题.md
docs/java/collection/Java集合框架常见面试题.md
+2
-0
未找到文件。
docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md
浏览文件 @
aea1dfb8
点击关注
[
公众号
](
#公众号
)
及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
<!-- TOC -->
-
[
何谓悲观锁与乐观锁
](
#何谓悲观锁与乐观锁
)
-
[
悲观锁
](
#悲观锁
)
-
[
乐观锁
](
#乐观锁
)
-
[
两种锁的使用场景
](
#两种锁的使用场景
)
-
[
乐观锁常见的两种实现方式
](
#乐观锁常见的两种实现方式
)
-
[
1. 版本号机制
](
#1-版本号机制
)
-
[
2. CAS算法
](
#2-cas算法
)
-
[
乐观锁的缺点
](
#乐观锁的缺点
)
-
[
1 ABA 问题
](
#1-aba-问题
)
-
[
2 循环时间长开销大
](
#2-循环时间长开销大
)
-
[
3 只能保证一个共享变量的原子操作
](
#3-只能保证一个共享变量的原子操作
)
-
[
CAS与synchronized的使用情景
](
#cas与synchronized的使用情景
)
<!-- /TOC -->
### 何谓悲观锁与乐观锁
> 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。
...
...
@@ -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
)
...
...
docs/java/J2EE基础知识.md
浏览文件 @
aea1dfb8
点击关注
[
公众号
](
#公众号
)
及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
<!-- MarkdownTOC -->
-
[
Servlet总结
](
#servlet总结
)
...
...
docs/java/Java IO与NIO.md
浏览文件 @
aea1dfb8
...
...
@@ -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方法的作用。
...
...
docs/java/Java基础知识.md
浏览文件 @
aea1dfb8
点击关注
[
公众号
](
#公众号
)
及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
<!-- TOC -->
-
[
1. 面向对象和面向过程的区别
](
#1-面向对象和面向过程的区别
)
...
...
docs/java/Java编程规范.md
浏览文件 @
aea1dfb8
根据各位建议加上了这部分内容,我暂时只是给出了两个资源,后续可能会对重要的点进行总结,然后更新在这里,如果你总结过这类东西,欢迎与我联系!
### 团队
...
...
docs/java/collection/Java集合框架常见面试题.md
浏览文件 @
aea1dfb8
点击关注
[
公众号
](
#公众号
)
及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
<!-- TOC -->
-
[
剖析面试最常见问题之Java基础知识
](
#剖析面试最常见问题之java基础知识
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录