Volatile

本文深入探讨了Java中的volatile关键字,它提供了一种轻量级的同步机制。volatile确保了变量的可见性,但不保证原子性。通过禁止指令重排,volatile解决了多线程环境下数据同步的问题。了解这些特性对于理解和优化多线程代码至关重要。
摘要由CSDN通过智能技术生成

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. img

  2. 原子性解决方案

    1. sychronize
    2. AtomicRefference

禁止指令重排

  1. 什么意思:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值