volatile 是轻量级的synchronized.
volatile 保证了共享变量的 "可见性". 即当一个线程改变了共享变量时。另外一个线程能读取到这个修改的值。而且是实时的。
当变量用volatile 修饰后,处理器在执行写操作的时候会先将缓存行数据写回系统内存中,然后写回系统内存后导致其他处理器中 缓存的内存地址无效。
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 线程间是如何同步