JMM和synchronized
Posted 512178509
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JMM和synchronized相关的知识,希望对你有一定的参考价值。
package com.fh.interview; /** * @author * @create 2018-05-27 下午4:40 **/ public class JMMTest { /** * 源代码--编译器指令重排序(编译器)--指令并行重排序(处理器)--内存指令重排序(处理器) * * JMM下对程序员提供的上层规则 * * 1、程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。 2、监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。 3、volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。 4、传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。 5、start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。 6、join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。 7、程序中断规则:对线程interrupted()方法的调用先行于被中断线程的代码检测到中断时间的发生。 8、对象finalize规则:一个对象的初始化完成(构造函数执行结束)先行于发生它的finalize()方法的开始。 */ public void test(){ } /** * synchronized * 如果锁的是类对象的话,尽管new多个实例对象, * 但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。 * javac JMMTest.java 编译出来JMMTest.class * 编译之后,切换到SynchronizedDemo.class的同级目录之后, * 然后用javap -v JMMTest.class查看字节码文件: * * * JMM核心:happens-before和内存抽象模型 * * happens-before实现原理: * 释放锁的时候会将值刷新到主内存中, * 其他线程获取锁时会强制从主内存中获取最新的值 * * 无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态 * synchronized的优化:CAS和对象头 * cas问题: * ABA问题,自旋时间过长,只能保证单个原子变量 * 对象头:Mark world * * * 偏向锁:对象头和栈针的锁记路中保存线程ID,修改对象头中的信息 * 轻量级锁:复制对象头中的mark world到栈中的锁记录中,尝试修改对象头中的信息改为指向 * 锁记录中的指针 * */ public synchronized void test1(){ } public static void main(String[] args) { synchronized (JMMTest.class){ } method(); } private static void method(){ } }
以上是关于JMM和synchronized的主要内容,如果未能解决你的问题,请参考以下文章
二:并发编程之JMM&synchronized&volatile详解
打工人,从 JMM 透析 volatile 与 synchronized 原理