美文网首页JUC编程-线程高级应用
JUC线程高级---volatile 关键字与内存可见性

JUC线程高级---volatile 关键字与内存可见性

作者: ZebraWei | 来源:发表于2018-05-30 15:09 被阅读18次

**版权声明:本文为小斑马伟原创文章,转载请注明出处!


Java JUC 简介:在Java 5.0 提供了java.util.concurrent(简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的Collection 实现等。

内存可见性:是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。
可见性错误:是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。

public class TestVolatile {

public static void main(String[] args) {
    ThreadDemo td = new ThreadDemo();
    new Thread(td).start();
    
    while(true){
        if(td.isFlag()){
            System.out.println("------------------");
            break;
        }
    }
 }
}
class ThreadDemo implements Runnable {

    private boolean flag = false;

    @Override
    public void run() {
    
        try {
            Thread.sleep(200);
         } catch (InterruptedException e) {
     }

    flag = true;
    
    System.out.println("flag=" + isFlag());

}

public boolean isFlag() {
    return flag;
}

public void setFlag(boolean flag) {
    this.flag = flag;
}

以上代码共享数据flag不可见导致main线程获取的flag状态为false,后面的打印输出无效。因此我们可以通过同步来保证对象被安全地发布。除此之外我们也可以使用一种更加轻量级的volatile 变量。
volatile 关键字:Java提供了一种稍弱的同步机制,即volatile 变量,用来确保将变量的更新操作通知到其他线程。可以将volatile 看做一个轻量级的锁,但是又与锁有些不同:
1.对于多线程,不是一种互斥关系
2.不能保证变量状态的“原子性操作

/*
 * 一、volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。
 *                    相较于 synchronized 是一种较为轻量级的同步策略。
 * 
 * 注意:
 * 1. volatile 不具备“互斥性”
 * 2. volatile 不能保证变量的“原子性”
 */
public class TestVolatile {

public static void main(String[] args) {
    ThreadDemo td = new ThreadDemo();
    new Thread(td).start();
    
    while(true){
        if(td.isFlag()){
            System.out.println("------------------");
            break;
        }
    }
}
 }

class ThreadDemo implements Runnable {

private volatile boolean flag = false;

@Override
public void run() {
    
    try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
    }

    flag = true;
    
    System.out.println("flag=" + isFlag());

}

public boolean isFlag() {
    return flag;
}

public void setFlag(boolean flag) {
    this.flag = flag;
}

}

相关文章

  • JUC

    JUC volatile关键字 不具备“互斥性”。 不能保证变量的“原子性” 内存可见性问题:当多个线程操作共享数...

  • JUC线程高级教程

    JUC 原创者:文思,感谢尚硅谷,资料来源于尚硅谷 目录: 1、volatile关键字与内存可见性 2、原子变量与...

  • JUC线程高级---volatile 关键字与内存可见性

    **版权声明:本文为小斑马伟原创文章,转载请注明出处! 内存可见性:是指当某个线程正在使用对象状态而另一个线程在同...

  • JUC

    1. Java JUC 简介 2. volatile 关键字-内存可见性 3. 原子变量-CAS算法 4. Con...

  • 多线程 | Volatile到底有什么用?

    Volatile的作用: 保持内存可见性.内存可见性:多个线程操作同一个变量,可确保写线程更新变量,其他读线程可以...

  • volatile什么时候使用

    volatile关键字 我们都知道volatile修饰的变量,保证了数据内存的可见性。 强迫每个线程在读取vola...

  • volatile关键字总结

    volatile保证了线程安全的可见性,是由jvm提供的机制。 java内存模型对volatile关键字定义的特殊...

  • volatile关键字

    对volatile关键字的总结:volatile用来保证该变量对所有线程的可见性(从主内存加载到工作线程的值是最新...

  • 深度解析volatile—底层实现

    我们都知道,Java关键字volatile的作用 1、内存可见性2、禁止指令重排序 可见性是指,在多线程环境,共享...

  • Java之Volatile轻量级同步使用

    volatile关键字有两个特性 内存可见性java内存模型规定对于多个线程共享的内存变量,是存储在主内存当中。每...

网友评论

    本文标题:JUC线程高级---volatile 关键字与内存可见性

    本文链接:https://www.haomeiwen.com/subject/ahotsftx.html