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

转载于:https://www.cnblogs.com/nihaofenghao/p/9096766.html

JMM和synchronized相关推荐

  1. java并发编程_Java并发编程之 synchronized

    大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...

  2. 并发编程-06线程安全性之可见性 (synchronized + volatile)

    文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...

  3. synchronized实现可见性对比volatile

    最近花时间研究了下,如有不正确的地方,欢迎大家批评指正,谢谢. 首先先介绍一下JMM(JAVA内存模型),上图: java内存模型的工作原理如上图所示,一些被定义的变量都存放在主内存中,当一个线程想要 ...

  4. java synchronized atomic_atomic 包、synchronized | Java 中线程安全

    相关阅读 之前已经说过了,我们在保证线程安全的时候主要就是保证线程安全的 3 大特性,原子性.可见性.有序性.而在 JMM 的层面也已经做了相关的操作,比方说 JMM 定义的 8 种原子操作以及相关的 ...

  5. synchronized的使用(一)

    多线程简介 在现代计算机中往往存在多个CPU核心,而1个CPU能同时运行一个线程,为了充分利用CPU多核心,提高CPU的效率,多线程就应时而生了. 那么多线程就一定比单线程快吗?答案是不一定,因为多线 ...

  6. java线程的内存模型_java多线程内存模型

    java多线程内存模型: 可见性 要实现共享变量的可见性,必须保证两点: 1.线程修改后的共享变量能够及时从工作内存刷新到主内存中: 2.其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存 ...

  7. java 线程可见性,Java多线程之内存可见性

    Java内存模型( JMM ) : 1) 所有的变量都存储在主内存中 2) 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本 ( 主内存中该变量的一份拷贝 ) JMM两条规定: 1) ...

  8. 相关疑惑解决,java线程虚假唤醒等等问题

    1. System.out.println方法是线程安全的 之前一直疑惑为啥下面案例中的主线程中num = 1会对线程A可见,注意没有加volatile修饰 class Test1{//public ...

  9. java高并发(六)线程安全性

    定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 线程安全性 ...

最新文章

  1. PostgreSQL 数据目录结构
  2. 用matlab提取lbp特征,求教大神给解释一下LBP特征提取每部分程序是干什么的
  3. linux服务器之间传输文件的四种方式
  4. 【转】visual studio 2012进行C语言开发[图文]
  5. 2021牛客NOIP提高组OI赛前模拟赛第一场T2——牛牛和数组操作(区间dp)
  6. 武松买酒案例 理解网络资源的请求流程
  7. urllib2:URLError与HTTPError
  8. Android动画定义知识小结
  9. 爬虫-request和BeautifulSoup模块
  10. UPDATE语句更新的顺序
  11. PWM波转DC直流之二阶RC低通滤波器设计
  12. 第一章---近红外光谱分析概述1
  13. 蒙特卡罗计算积分matlab,matlab下二重积分的蒙特卡洛算法
  14. 神界计算机丢失msvcp120.dll,Win7系统msvcp120.dll丢失的解决方法
  15. 推荐一个 github 项目 spider163,抓取网络数据,歌曲评论等数据
  16. 怎么检查新买的mac是不是原封正品
  17. 牛逼,我用Python做了一个word、PPT水印添加器!还带加密功能!
  18. CSS初级教程(颜色、注释、选择器)【第一天】
  19. NOIP2017提高组复赛总结
  20. 最强大脑魏郭撕X,理科男与文科生的…

热门文章

  1. Linux网络编程一步一步学-UDP方式点对点通讯
  2. 华为鸿蒙系统游戏体验,华为鸿蒙系统首发体验,游戏加载比安卓快60%,全面苹果挑战iOS...
  3. mongoose c++封装
  4. 智慧讲台:office 文件 pdf 文件 转成 png图片
  5. Oracle:数据类型速记
  6. 【Flink】Flink CancellationException null DefaultExecutionGraphCache LeaderRetrievalHandler
  7. 95-40-014-生产者-KafkaProducer
  8. 【Java】Java对象引用四个级别(强、软、弱、虚)
  9. Java 使用阿里巴巴 Dns Cache Manipulator
  10. Spring : ImportBeanDefinitionRegistrar源码分析