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
转载于:https://www.cnblogs.com/nihaofenghao/p/9096766.html
JMM和synchronized相关推荐
- java并发编程_Java并发编程之 synchronized
大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下Java中内存泄漏如何分析解决的相关知识,今天跟大家分享Java之 sync ...
- 并发编程-06线程安全性之可见性 (synchronized + volatile)
文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...
- synchronized实现可见性对比volatile
最近花时间研究了下,如有不正确的地方,欢迎大家批评指正,谢谢. 首先先介绍一下JMM(JAVA内存模型),上图: java内存模型的工作原理如上图所示,一些被定义的变量都存放在主内存中,当一个线程想要 ...
- java synchronized atomic_atomic 包、synchronized | Java 中线程安全
相关阅读 之前已经说过了,我们在保证线程安全的时候主要就是保证线程安全的 3 大特性,原子性.可见性.有序性.而在 JMM 的层面也已经做了相关的操作,比方说 JMM 定义的 8 种原子操作以及相关的 ...
- synchronized的使用(一)
多线程简介 在现代计算机中往往存在多个CPU核心,而1个CPU能同时运行一个线程,为了充分利用CPU多核心,提高CPU的效率,多线程就应时而生了. 那么多线程就一定比单线程快吗?答案是不一定,因为多线 ...
- java线程的内存模型_java多线程内存模型
java多线程内存模型: 可见性 要实现共享变量的可见性,必须保证两点: 1.线程修改后的共享变量能够及时从工作内存刷新到主内存中: 2.其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存 ...
- java 线程可见性,Java多线程之内存可见性
Java内存模型( JMM ) : 1) 所有的变量都存储在主内存中 2) 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本 ( 主内存中该变量的一份拷贝 ) JMM两条规定: 1) ...
- 相关疑惑解决,java线程虚假唤醒等等问题
1. System.out.println方法是线程安全的 之前一直疑惑为啥下面案例中的主线程中num = 1会对线程A可见,注意没有加volatile修饰 class Test1{//public ...
- java高并发(六)线程安全性
定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 线程安全性 ...
最新文章
- JSONP实现Ajax跨域请求
- sql server无效的对象名称 - 但表列在SSMS表列表中
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- 注册中心—组件—Eureka
- css 容器内 div 底部,CSS:在div容器的底部放置一個div容器
- 推荐系统相关资源搜集
- 操作系统课设之Linux 进程间通信
- Dlib 19.14发布——增加了一个训练RBF-SVM的auto-ML工具
- java xfire指定参数名_Java如何获取方法参数具体名称?这是个好问题!
- 解读阿里巴巴Java手册:为什么不建议使用Executors创建线程池?
- “交通·未来”第22期:城市轨道交通管理与控制优化:相关问题及方法
- Xshell安装宝塔Linux面板教程
- 好用的PDF编辑软件有哪些?这几款工具建议收藏
- 合宙 4G模块Air720D Mini PCI-E 开发教程
- 最新版黑苹果MacOS 10.14 Mojave安装教程
- 51单片机:P1口输入/输出实验1(控制发光二极管亮灭)
- python 埋点 库_vue 友盟统计埋点插件
- Java学习路线:day6 数组
- 点击图标分享页面到QQ,微信,微博 等
- 【LM】电池电量水平低 保留电池电量 关键级别电池电量水平
热门文章
- 35岁的测试是测试的天花板吗?
- 初入c++ (八) c++输入和输出
- setnx是原子操作吗_Redis面试七连问,你能扛得住吗?
- 基于神经网络预测车道行驶的自动驾驶
- Golang实践录:使用gin框架实现转发功能:上传文件并转
- Linux移植随笔:git的使用
- python测试脚本截图_Python+selenium实现截图图片并保存截取的图片
- 【Flink】Flink 模拟 kafka 消费重启后 能接着读取 保存状态信息
- 【Elasticsearch】Elasticsearch gateway 流程分析
- 95-847-044-源码-Netty-NettyClient创建