资讯专栏INFORMATION COLUMN

哪些指令不能重排序:Happen-Before 神器

张迁 / 444人阅读

摘要:以下原则是指令重排序不可违背的程序顺序性原则一个线程内保证语意的串行性原则变量的写,先发生于读,这保证了变量的可见性传递性先于,先于,那么必然先于线程的方法先于它的每一个动作线程的所有操作先于线程的终结锁规则解锁必然发生在随后的加锁前线程的

以下原则是指令重排序不可违背的:

1.程序顺序性原则:一个线程内保证语意的串行性
2.volatile原则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
3.传递性:A先于B,B先于C,那么A必然先于C
4.线程的start()方法先于它的每一个动作
5.线程的所有操作先于线程的终结(Thread.join)
6.锁规则:解锁必然发生在随后的加锁前
7.线程的中断先于被中断线程的代码
8.对象的构造函数执行,结束先于finalize()方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74704.html

相关文章

  • java内存模型

    摘要:顺序一致性内存模型有两大特性一个线程中所有操作必须按照程序的顺序执行。这里的同步包括对常用同步原语的正确使用通过以下程序说明与顺序一致性两种内存模型的对比顺序一致性模型中所有操作完全按程序的顺序串行执行。 java内存模型 java内存模型基础 happen-before模型 JSR-133使用happen-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结...

    2i18ns 评论0 收藏0
  • Java并发编程-原子操作

    摘要:这个规则比较好理解,无论是在单线程环境还是多线程环境,一个锁处于被锁定状态,那么必须先执行操作后面才能进行操作。线程启动规则独享的方法先行于此线程的每一个动作。 1. 指令重排序 关于指令重排序的概念,比较复杂,不好理解。我们从一个例子分析: public class SimpleHappenBefore { /** 这是一个验证结果的变量 */ private st...

    SillyMonkey 评论0 收藏0
  • java volatile 关键字

    摘要:举个例子,在多线程不使用环境中,每个线程会从主存中复制变量到缓存以提高性能。保证了变量的可见性关键字解决了变量的可见性问题。在多线程同时共享变量的情形下,关键字已不足以保证程序的并发性。 volatile 关键字能把 Java 变量标记成被存储到主存中。这表示每一次读取 volatile 变量都会访问计算机主存,而不是 CPU 缓存。每一次对 volatile 变量的写操作不仅会写到 ...

    scola666 评论0 收藏0
  • Java并发编程,3分分钟深入分析volatile的实现原理

    摘要:一言以蔽之,被修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。为了实现内存语义时,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。volatile原理volatile简介Java内存模型告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。 线程在工作内存进行操作后何时会写到主内存中...

    番茄西红柿 评论0 收藏0
  • Java并发编程,3分分钟深入分析volatile的实现原理

    摘要:一言以蔽之,被修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。为了实现内存语义时,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。volatile原理volatile简介Java内存模型告诉我们,各个线程会将共享变量从主内存中拷贝到工作内存,然后执行引擎会基于工作内存中的数据进行操作处理。 线程在工作内存进行操作后何时会写到主内存中...

    番茄西红柿 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<