首页 > 软件开发 > JAVA >

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

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

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

工具/原料

  • java8
  • intellij idea

方法/步骤

  • 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 3

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

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

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

  • 4

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

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

  • 5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 6

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

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

  • 7

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


    标签: JAVA

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