设为首页 加入收藏

TOP

内存屏障和 volatile 语义(四)
2018-10-06 21:33:06 】 浏览:202
Tags:内存 屏障 volatile 语义
续对它的读之前
  • 线程启动法则:Thread.start一定发生在线程中的动作前
  • 线程终结法则:线程中的任何动作一定发生在线程终结之前(其他线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false)
  • 中断法则:一个线程调用另一个线程的interrupt一定发生在另一线程发现中断之前。
  • 终结法则:一个对象的构造函数结束一定发生在对象的finalizer之前
  • 传递性:A发生在B之前,B发生在C之前,A一定发生在C之前。
  • 使用HB关系,在多线程开发时就可以尽量少的避免使用锁,而是直接利用hb关系和volatile关键字来达到信息传递并且可见的目的。

    比如很常见的一个线程处理一些数据并且修改标识位后,另外的线程检测到标识位发生改变,就接手后续的流程。此时如何保证前一个线程对数据做出的更改后一个线程全部可见呢。先来看下面的代码例子

    class VolatileExample {
        int a = 0;
        volatile boolean flag = false;
    
        public void writer() {
            a = 1;     //1
            flag = true;    //2
        }
    
        public void reader() {
            while(flag==false); //3
            int i=a; //4
        }
    }

    有两个不同的线程分别执行writer和reader方法,根据Hb规则,有如下的顺序执行图。

    这样的顺序,i读取到的a的值就是最新的,也即是1.

    参考文献

    首页 上一页 1 2 3 4 下一页 尾页 4/4/4
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇SpringBoot | 第二十二章:定时任.. 下一篇SpringBoot | 第二十一章:异步开..

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目