首页 > 软件开发 > JAVA >

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

来源:互联网 2023-03-16 19:17:18 578

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

工具/原料

  • java8
  • intellij idea

方法/步骤

  • 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 3

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

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

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

  • 4

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

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

  • 5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 6

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

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

  • 7

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


    标签: JAVA

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