线程安全与volatile关键字

文章讨论了线程安全和线程不安全的概念,通过代码示例解释了线程不安全可能导致的问题,如并发修改同一个变量时的bug。文章深入探讨了线程不安全的原因,包括非原子操作、内存可见性和指令重排序。解决方案主要涉及使用`synchronized`关键字确保原子性和内存可见性,以及`volatile`关键字的作用,防止指令重排序并确保内存可见性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程都能带来哪些风险?想了解线程安全问题吗?请仔细阅读本篇文章,将详细带你学习什么是线程安全!!!


目录

一、什么是线程安全和线程不安全?

二、线程不安全的原因

三、如何解决线程不安全问题

四、内存可见性问题-volatile

4.1volatile详解

4.2“房子装修”


一、什么是线程安全和线程不安全?

简单来说,某个代码,在多线程环境下执行,会出bug,就叫做线程不安全。

线程安全:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。

本质上是因为线程之间的调度顺序是不确定的,那么我来举例说明一下:

class Counter{
   private int count = 0;

   public void add(){
      count++;
  }

  public int get(){
       return count;
  }
}

class ThreadDemo{
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter.add();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter.add();
            }
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(counter.get());
    }
}

上述代码是俩个线程针对同一个变量,各自自增5w次,那么结果会是什么?

是10w吗?还是其他?下面来看结果:

此时会疑惑???为什么不是正常预期中的结果呢?这是因为由多线程引起的bug,线程不安全问题!!!

那么为什么会出现上述情况呢,和线程的随机调度密切相关!!!

count++操作,本质上是三个cpu指令构成

1.load,把内存中的数据读取到cpu寄存器中

2.add,把寄存器中的值,进行+1运算

3.save

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值