JUC
是什么
Java 5.0 提供了 java.util.concurrent (简称 JUC )包
做了啥
增加并发编程中实用工具类
用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架
提供可调的、灵活的线程池
还提供了设计用于多线程上下文中的 Collection 实现等
内存可见性
1.是什么?
内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态
2.要怎么做
需要确保当一个线程修改了对象状态后其他线程能够看到发生的状态变化
- volatile 关键字
Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。
可以将 volatile 看做一个轻量级的锁,
但是又与锁有些不同,对于多线程
- 不是一种互斥关系
- 不能保证变量状态的“原子性操作”
CAS 算法
- CAS (Compare-And-Swap) 是一种硬件对并发的支持,针对多处理器 操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。
- 是一种无锁的非阻塞算法的实现
CAS 包含了 3 个操作数:
- 需要读写的内存值 V
- 进行比较的值 A
- 拟写入的新值 B
假如现在有两个线程t1,t2,,他们各自的运行环境中都有共享变量的副本V1、V2,预期值E1、E2,预期主存中的值还没有被改变,假设现在在并发环境,并且t1先拿到了执行权限,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次发起尝试,然后t1比较预期值E1和主存中的V,发现E1=V,说明预期值是正确的,执行N1=V1+1,并将N1的值传入主存。这时候贮存中的V=21,然后t2又紧接着拿到了执行权,比较E2和主存V的值,由于V已经被t1改为21,所以E2!=V,t2线程将主存中已经改变的值更新到自己的副本中,再发起重试;直到预期值等于主存中的值,说明没有别的线程对旧值进行修改,继续执行代码,退出;