美文网首页
volatile线程可见性,但不能保证操作原子性

volatile线程可见性,但不能保证操作原子性

作者: zhaozhaoicode | 来源:发表于2020-05-07 00:31 被阅读0次

volatile特性

  • 保证线程可见性 MESI缓存一致性协议
  • 禁止指令重排序

volatile线程可见性,但不能保证操作原子性

import java.util.ArrayList;
import java.util.List;

public class TestVolatileNotSync {
    
    volatile int count = 0;
    void m() {
        for(int i=0; i<10000; i++) count++;
    }
    
    public static void main(String[] args) {
        TestVolatileNotSync t = new TestVolatileNotSync();
        
        List<Thread> threads = new ArrayList<Thread>();
        
        for(int i=0; i<10; i++) {
            threads.add(new Thread(t::m, "thread-"+i));
        }
        
        threads.forEach(Thread::start);
        
        threads.forEach((o)->{
            try {
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(t.count);
    }
}

输入结果:58155

多次运行到达不了100000,volatile并不能保证多个线程共同修改i变量时所带来的不一致问题,也就是说volatile不能替代synchronized。

import java.util.ArrayList;
import java.util.List;


public class TestVolatileSync {
    /*volatile*/ int count = 0;

    synchronized void m() { 
        for (int i = 0; i < 10000; i++)
            count++;
    }

    public static void main(String[] args) {
        TestVolatileSync t = new TestVolatileSync();

        List<Thread> threads = new ArrayList<Thread>();

        for (int i = 0; i < 10; i++) {
            threads.add(new Thread(t::m, "thread-" + i));
        }

        threads.forEach((o) -> o.start());

        threads.forEach((o) -> {
            try {
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        System.out.println(t.count);

    }

}

输入结果:100000

指令重排序不好模拟,据说可以使用asm修改字节码模拟

相关文章

  • 多线程-volatile

    volatile by shihang.mai volatile特性 只保证了行程可见性,保证不了原子性 保证线程...

  • 2018-07-12

    volatile不能保证原子性,所以用它修饰的变量,如果执行非原子性操作,那不能保证线程安全,比如++操作,但是=...

  • Sychronized & Volatile

    Synchronized 保证了可见性 ,并且保证了原子性Volatile只保证了可见性,不能保证原子性,即只能保...

  • JUC

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

  • volatile 关键字

    volatile 关键字 使一个变量在多个线程中可见 (只能保证可见性 不能保证原子性) 使用volatile关键...

  • volatile使用

    volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性 volatile与synchronized的...

  • volatile关键字

    1、概述 volatile保证多线程下变量可见性和有序性的问题,不保证原子性。 volatile不是并发安全的,因...

  • volatile和Synchronized关键字说明

    一、volatile 修饰共享变量,保证变量的可见性和有序性,不保证原子性 保证可见性线程A在工作内存中修改的共享...

  • 浅聊 volatile原理

    volatile volatile 只能保证对单次读/写的原子性。i++ 这种符合操作操作不能保证原子性。 禁止指...

  • 2018-02-28线程-线程池

    volatile 不能保证一般变量的操作原子性原因是由于 volatile 不能保证非原子性操作的一致性,eg变量...

网友评论

      本文标题:volatile线程可见性,但不能保证操作原子性

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