栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Volatile

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Volatile

Volatile

是什么:

  1. ​ jvm提供的轻量级的同步机制

特性

  1. 可见性
  2. 不保证原子性
  3. 禁止指令重排性

JMM

  1. Java内存模型,是一种规则和规范,并不实际存在
  2. 特点:可见性 原子性 有序性

可见性:

  1. 当多个线程操作一个对象时,每个线程都有自己独立的储存空间,如果使用volatile,则可以使一个线程修改公共资源,其他对象也可以知道。
  2. 有的jdk版本不加volatile其实也带有可见性
  3. 可见性修改是指 有一个主内存 然后进来多个线程,每个线程拷贝一份主内存的数据,然后在自己的工作内存中进行修改,修改好了直接替换掉主内存中原有的数据,而其他线程也会知道数据已经被修改。
public class volatile_learn {
    public static void main(String[] args) {
        Person alan = new Person();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+" come in");

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                //TODO: handle exception
            }

            alan.add();
            System.out.println(Thread.currentThread().getName()+": "+alan.age);
        },"A").start();  
        
        try {
                Thread.sleep(2000);
            } catch (Exception e) {
                //TODO: handle exception
            }
        

        System.out.println(Thread.currentThread().getName()+" :"+alan.age);
    }
}
class Person{
    volatile int age;
    public void add() {
        age = 10;
    }
    public void delete() {
        age = 5;
    }
}

不保证原子性

  1. 原子性解决方案

    1. sychronize
    2. AtomicRefference

禁止指令重排

  1. 什么意思:

    1. 我们正常写代码的顺序 可能和 编译器执行代码 的顺序不同,但是底层还是遵守数据依赖性的,也就是先定义,而后面的赋值则顺序可能被重排,这会影响线程的安全性。

    2. 就好比我们看一本书,书的目录和整体结构都是事先定义好的,但我们可能有的地方看不懂,则进行跳跃式阅读,找自己读起来容易的地方先读,这就是底层进行指令重排的目的,先执行简单的。

    3. 使用volatile可以保证编译不重排,解决指令重排导致的可见性问题和有序性问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992650.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号