线程安全问题以及 volatile 的使用和原理

本文探讨了线程安全问题,包括线程安全的概念和不安全因素。重点介绍了Java中的volatile关键字,它能保证内存可见性和防止指令重排序。volatile通过内存屏障来实现这一功能,确保多线程环境下的正确性。
摘要由CSDN通过智能技术生成


​1. 线程安全问题

1.1 线程安全概念

在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。也就是多个线程访问同一个对象时,如果不用其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。

1.2 线程不安全因素

  • 抢占式执行
  • 多个线程同时修改了同一个变量
  • 非原子性操作
  • 内存可见性问题
  • 指令重排序问题 ​

使用锁是 Java 中解决线程安全问题中最重要的手段。

2. volatile 关键字

2.1 volatile 的作用

volatile 可以解决内存可见性和指令重排序的问题。

  • volatile 保证变量对所有线程的可见性:代码在写入 volatile 修饰的变量时,改变线程工作内存中 volatile 变量的值,修改后的值会立即从工作内存刷新到主内存中,新值对所有线程会立即更新。代码在读取 volatile 修饰的变量时,先从主内存中读取 volatile 变量的最新值到线程的工作内存中,再从工作内存中读取 volatile 变量的副本值。所以说多线程环境下 volatile修饰的变量值一定是最新的。
  • jdk1.5以后 volatile 完全避免了指令重排优化,实现了有序性。

2.2 volatile 的使用

2.2.1 保证内存可见性

不可见性问题主要指一个线程修改了共享变量值,而另一个线程却看不到。volatile 关键字可以保证内存可见性。

public class VolatileTest {
    int a = 1;
    int b = 2;

    public void change(){
        a = 3;
        b = a;
    }

    public void print(){
        System.out.println("b&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值