首页 > 软件开发 > JAVA >

java8线程高级-volatile关键字与内存可见性介绍

来源:互联网 2023-03-16 19:17:18 版权归原作者所有,如有侵权,请联系我们

java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

工具/原料

  • java8
  • intellij idea

方法/步骤

  • 1

    线程可见性测试:Qnf办公区 - 实用经验教程分享!

    package com.gwolf;Qnf办公区 - 实用经验教程分享!

    public class TestVolatile {Qnf办公区 - 实用经验教程分享!

    public static void main(String[] args) {Qnf办公区 - 实用经验教程分享!

    ThreadDemo threadDemo = new ThreadDemo();Qnf办公区 - 实用经验教程分享!

    new Thread(threadDemo).start();Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    while (true) {Qnf办公区 - 实用经验教程分享!

    if(threadDemo.isFlag()) {Qnf办公区 - 实用经验教程分享!

    System.out.println("-------------------");Qnf办公区 - 实用经验教程分享!

    break;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    class ThreadDemo implements Runnable {Qnf办公区 - 实用经验教程分享!

    private boolean flag = false;Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    @OverrideQnf办公区 - 实用经验教程分享!

    public void run() {Qnf办公区 - 实用经验教程分享!

    try {Qnf办公区 - 实用经验教程分享!

    Thread.sleep(200);Qnf办公区 - 实用经验教程分享!

    } catch (InterruptedException e) {Qnf办公区 - 实用经验教程分享!

    e.printStackTrace();Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    flag = true;Qnf办公区 - 实用经验教程分享!

    System.out.print("flag = " isFlag());Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    public boolean isFlag() {Qnf办公区 - 实用经验教程分享!

    return flag;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    public void setFlag(boolean flag) {Qnf办公区 - 实用经验教程分享!

    this.flag = flag;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 1相关内容非法爬取自百度经验
  • 2

    上面程序的输出会是一个什么样的结果:Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 3

    程序结果说明主线程不能得到子线程中的值。Qnf办公区 - 实用经验教程分享!

    原因是线程之间没有共享变量,每个线程有一块独立的内存空间Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 4

    内存可见性问题是当多个线程操作共享数据时,批次不可见Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 5

    使用同步锁解决,让程序去主存中读取数据Qnf办公区 - 实用经验教程分享!

    package com.gwolf;Qnf办公区 - 实用经验教程分享!

    public class TestVolatile {Qnf办公区 - 实用经验教程分享!

    public static void main(String[] args) {Qnf办公区 - 实用经验教程分享!

    ThreadDemo threadDemo = new ThreadDemo();Qnf办公区 - 实用经验教程分享!

    new Thread(threadDemo).start();Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    while (true) {Qnf办公区 - 实用经验教程分享!

    synchronized (threadDemo) {Qnf办公区 - 实用经验教程分享!

    if (threadDemo.isFlag()) {Qnf办公区 - 实用经验教程分享!

    System.out.println("-------------------");Qnf办公区 - 实用经验教程分享!

    break;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    class ThreadDemo implements Runnable {Qnf办公区 - 实用经验教程分享!

    private boolean flag = false;Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    @OverrideQnf办公区 - 实用经验教程分享!

    public void run() {Qnf办公区 - 实用经验教程分享!

    try {Qnf办公区 - 实用经验教程分享!

    Thread.sleep(200);Qnf办公区 - 实用经验教程分享!

    } catch (InterruptedException e) {Qnf办公区 - 实用经验教程分享!

    e.printStackTrace();Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    flag = true;Qnf办公区 - 实用经验教程分享!

    System.out.print("flag = " isFlag());Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    public boolean isFlag() {Qnf办公区 - 实用经验教程分享!

    return flag;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    public void setFlag(boolean flag) {Qnf办公区 - 实用经验教程分享!

    this.flag = flag;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 6

    此时查看程序运行结果:Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 7

    使用volatile关键字解决内存可见性问题,当多个线程进行共享数据时,可以保证内存中的数据可见Qnf办公区 - 实用经验教程分享!

    package com.gwolf;Qnf办公区 - 实用经验教程分享!

    public class TestVolatile {Qnf办公区 - 实用经验教程分享!

    public static void main(String[] args) {Qnf办公区 - 实用经验教程分享!

    ThreadDemo threadDemo = new ThreadDemo();Qnf办公区 - 实用经验教程分享!

    new Thread(threadDemo).start();Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    while (true) {Qnf办公区 - 实用经验教程分享!

    if (threadDemo.isFlag()) {Qnf办公区 - 实用经验教程分享!

    System.out.println("-------------------");Qnf办公区 - 实用经验教程分享!

    break;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    class ThreadDemo implements Runnable {Qnf办公区 - 实用经验教程分享!

    private volatile boolean flag = false;Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    @OverrideQnf办公区 - 实用经验教程分享!

    public void run() {Qnf办公区 - 实用经验教程分享!

    try {Qnf办公区 - 实用经验教程分享!

    Thread.sleep(200);Qnf办公区 - 实用经验教程分享!

    } catch (InterruptedException e) {Qnf办公区 - 实用经验教程分享!

    e.printStackTrace();Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    flag = true;Qnf办公区 - 实用经验教程分享!

    System.out.print("flag = " isFlag());Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    public boolean isFlag() {Qnf办公区 - 实用经验教程分享!

    return flag;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    Qnf办公区 - 实用经验教程分享!

    public void setFlag(boolean flag) {Qnf办公区 - 实用经验教程分享!

    this.flag = flag;Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    }Qnf办公区 - 实用经验教程分享!

    java8线程高级-volatile关键字与内存可见性介绍Qnf办公区 - 实用经验教程分享!

  • 以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!Qnf办公区 - 实用经验教程分享!


    标签: JAVA

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号