Java 内存模型中的可见性、原子性、有序性

可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的,也就是一个线程修改的结果。另一个线程马上就能看到

如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的

volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。

 在 Java 中 volatile、synchronized 和 final 实现可见性

原子性:原子是世界上的最小单位,具有不可分割性

在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性。

有序性: Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。

volatile关键字用法

public class Counter { 

    public volatile static int count = 0; 

    public static void inc() { 

        //这里延迟1毫秒,使得结果明显 
        try { 
            Thread.sleep(1); 
        } catch (InterruptedException e) { 
        } 

        count++; 
    } 

    public static void main(String[] args) { 

        //同时启动1000个线程,去进行i++计算,看看实际结果 

        for (int i = 0; i < 1000; i++) { 
            new Thread(new Runnable() { 
                @Override
                public void run() { 
                    Counter.inc(); 
                } 
            }).start(); 
        } 

        //这里每次运行的值都有可能不同,可能为1000 
        System.out.println(“运行结果:Counter.count=” + Counter.count); 
    } 
}

由于volatile具有可见性,在不并发的情况下是1000,实际输出只有994,由于并发原因

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/douxingpeng1/article/details/82050638
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞