java.util.concurrent
(简称JUC)包,在此包中增加了在并发编程中很常用的工具类
用于定义类似于线程的自定义子系统,包括线程池
,异步 IO
和轻量级任务框架
,还提供了设计用于多线程上下文中
的Collection实现
等
volatile、synchronized 和 final 实现可见性。
synchronized 和在 lock、unlock 中操作保证原子性。
volatile 和 synchronized 两个关键字来保证线程之间操作的有序性
volatile 关键字
private volatile int account = 100;
synchronized也能保证可见性,但是效率低
volatile关键字为域变量的访问提供了一种免锁机制,较为轻量级的同步策略:
- volatile 修饰的变量,就会具有
可见性
。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存,而不是使用寄存器中的值 - volatile 不会提供任何原子操作,它也不能用来修饰final类型的变量
- volatile 不具备"互斥性"
注:volatile只能让被他修饰内容具有可见性
,但不能保证它具有原子性
比如volatile int a = 0;
之后有一个操作a++;
这个变量a具有可见性,但是a++
依然是一个非原子操作,
也就是这个操作同样存在线程安全问题。
i++
java.util.concurrent.atomic
包下,提供了常用的原子变量
private AtomicInteger serialNumber = new AtomicInteger();
// 自增运算
serialNumber.getAndIncrement();