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(){

    }
}
View Code

 

以上是关于JMM和synchronized的主要内容,如果未能解决你的问题,请参考以下文章

JMM

JMM

二:并发编程之JMM&synchronized&volatile详解

打工人,从 JMM 透析 volatile 与 synchronized 原理

打工人,从 JMM 透析 volatile 与 synchronized 原理

JMM和Volatile底层原理分析