1:JMM其实是java虚拟机栈的一部分
2:主内存和工作内存:都属于Java虚拟机内存
主内存:主要对应于JVM内存区域中的堆内存中的对象实例数据部分
工作内存:主要对应于JVM内存区域中的虚拟机栈中的部分区域
主内存与工作内存的数据交换操作的过程(通过总线bus通信,涉及总线嗅探机制及缓存一致性知识、MESI通信协议):
涉及八个原子操作:lock(锁定), unlock(解锁), read(读取), load(加载), use(使用), assign(赋值), store(存储), write(写入)
3:volatile 修饰的变量的特殊性
volatile 是虚拟机提供的最轻量级的同步机制;
被volatile修饰的变量将具备以下两种特性:
1)可见性:一个变量修改了这个变量的值时,所有共享此变量的线程都会立即知道
2)禁止指令重排序优化(机器级别语言-汇编):内存屏障概念
注:final修饰的字段在构造器种初始化成功后,对其他线程也可见
4:java 内存模型的特征:
1)原子性:某些操作是原子的
2)可见性:一个变量修改了这个变量的值时,所有共享此变量的线程都会立即知道
3)有序性:先行发生原则提供部分保障--操作A在B之前发生,则A产生的影响能被B观察到,影响包括修改了内存中共享变量的值、发送消息、调用方法等
Java内存模型提供了8种默认的先行发生关系:
1:程序次序规则 2:管程锁定规则 3:volatile变量规则 4:线程启动规则 5:线程终止规则 6:线程终端规则 7:对象终结规则 8:传递性
5:java线程安全实现方法:
1)互斥同步:互斥是方法,同步是目的--例如synchronized 和JUC并发包下的ReentrantLock [riː\'entrənt] (重入锁)
ReentrantLock:等待可中断、可实现公平锁、以及锁可以绑定多个条件,JDK1.6以后他们的性能基本一样,更倾向于用synchronized实现。
2)非阻塞同步:乐观的并发策略--CAS操作(JDK1.5之后的包sun.misc.Unsafe类,启动类加载器(Bootstrap ClassLoader)加载的Class才能访问它;ABA问题)
3)无同步方案:不涉及数据共享的代码天生就是线程安全的--可重入代码和线程本地存储(java.lang.ThreadLocal类)
6:多线程锁优化
1)自旋锁与自适应锁 2)消除锁 3)粗化锁 4)轻量级锁 5)偏向锁