Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
CS-Notes
提交
5eca2e17
C
CS-Notes
项目概览
wushizhenking
/
CS-Notes
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
CS-Notes
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5eca2e17
编写于
4月 09, 2018
作者:
C
CyC2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
auto commit
上级
5d4376eb
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
18 addition
and
2 deletion
+18
-2
notes/Java 基础.md
notes/Java 基础.md
+12
-0
notes/Java 并发.md
notes/Java 并发.md
+6
-2
未找到文件。
notes/Java 基础.md
浏览文件 @
5eca2e17
...
...
@@ -128,6 +128,18 @@ public InitialOrderTest() {
5.
子类(实例变量、普通语句块)
6.
子类(构造函数)
**5. 静态内部类**
内部类的一种,静态内部类不依赖外部类,且不能访问外部类的非 static 变量和方法。
**6. 静态导包**
```
source-java
import static com.xxx.ClassName.*
```
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
# 二、Object 通用方法
## 概览
...
...
notes/Java 并发.md
浏览文件 @
5eca2e17
...
...
@@ -1061,13 +1061,13 @@ Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互
### 1. 原子性
Java 内存模型
允许虚拟机将没有被 volatile 修饰的 64 位数据(long,double)的读写操作划分为两次 32 位的操作来进行,也就是说对这部分数据的
操作可以不具备原子性。
Java 内存模型
保证了 read、load、use、assign、store、write、lock 和 unlock 操作具有原子性,例如对一个 int 类型的变量执行 assign 赋值操作,这个操作就是原子性的。但是 Java 内存模型允许虚拟机将没有被 volatile 修饰的 64 位数据(long,double)的读写操作划分为两次 32 位的操作来进行,即 load、store、read 和 write
操作可以不具备原子性。
有一个错误认识就是,int 等原子性的变量在多线程环境中不会出现线程安全问题。前面的线程不安全示例代码中,cnt 变量属于 int 类型变量,1000 个线程对它进行自增操作之后,得到的值为 997 而不是 1000。
为了方便讨论,将内存间的交互操作简化为 3 个:load、assign、store。
下图演示了两个线程同时对 cnt 变量进行操作,load、assign、store 这一系列操作不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存,T2 依然可以读入该变量的值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。
下图演示了两个线程同时对 cnt 变量进行操作,load、assign、store 这一系列操作
整体上看
不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存,T2 依然可以读入该变量的值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。
<div
align=
"center"
>
<img
src=
"../pics//ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png"
/>
</div><br>
...
...
@@ -1154,6 +1154,10 @@ public class AtomicSynchronizedExample {
volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。
对前面的线程不安全示例中的 cnt 变量用 volatile 修饰,不能解决线程不安全问题。因为 volatile 并不能保证操作的原子性。
// TODO:volatile 不能解决线程不安全问题的示例代码。
### 3. 有序性
有序性是指:在本线程内观察,所有操作都是有序的。在一个线程观察另一个线程,所有操作都是无序的,无序是因为发生了指令重排序。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录