Skip to content

Alec-DSheng/concurrency

Repository files navigation

1 volatile 应用

volatile 是轻量级的synchronized.
volatile 保证了共享变量的 "可见性". 即当一个线程改变了共享变量时。另外一个线程能读取到这个修改的值。而且是实时的。

volatile定义:Java语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新。线程应该确保通过排他锁单独获取这个变量

volatile 保证共享变量的可见性的原理:

当变量用volatile 修饰后,处理器在执行写操作的时候会先将缓存行数据写回系统内存中,然后写回系统内存后导致其他处理器中 缓存的内存地址无效。

2 synchronized 重量级锁

synchronized 实现锁的三种形式
1 对于普通同步方法, 锁是当前实例对象
2 对于静态同步方法, 锁是当前类的Class对象
3 对于同步方法块, 锁是Synchronized 括号里面配置的对象

synchronized 锁存在于Java 对象头, 如果对象是数组,虚拟机用三个子宽存储对象头
锁的四种状态

0 无锁状态

1 偏向锁状态
当一个线程访问同步代码块,并获得锁时,会在对象头和栈帧中的锁记录里存储该线程的ID。以后该线程进入和退出同步代码 块时不需要再进行CAS操作加锁和解锁。

CAS 实现原子操作的三大问题 1 ABA问题 - AtomicStampedReference 2 循环时间长CPU开销大 3 单一共享变量可用。只能是对单个变量做原子操作。无法对多个共享变量做原子操作

2 轻量级锁状态

3 重量级锁状态

JAVA的内存模型 并发编程中需要解决的2个问题: 1 线程间是如何通讯 通讯方式有 共享内存 和 消息传递 2种 在共享内存模型下。线程通过读-写公共内存中的状态来实现隐式通讯。 2 线程间是如何同步

About

并发编程实例

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages