多线程——线程安全

目录

·前言

一、观察线程不安全

二、线程安全概念

三、产生线程安全问题的原因

1.分析示例代码

2.线程随机调度

3.修改共享数据

4.原子性

5.可见性

6.指令重排序

四、解决示例代码的问题

·结尾


·前言

        我们学习多线程编程的目的是为了能够实现“并发编程”,从而来提高我们代码的执行效率,在学习使用多线程时,一定避免不了“线程安全”这样的话题,这可以称的上我们多线程编程中最重要的部分,因为他会关系到我们所写的代码是否能够正确的运行,同时,线程安全也是学习多线程编程中最困难的部分,本篇文章将会对“线程安全”这一话题进行讲解。

一、观察线程不安全

        这里我通过一个代码示例来展现一下线程不安全是什么样的,下面代码示例做的主要工作是使用两个线程,分别对变量 count 进行自增操作,从而快速达到自增 10w 次的效果(一个线程对变量 count 进行 5w 次的自增),代码及运行结果如下:

// 线程不安全演示代码
public class ThreadDemo13 {
    public static int count = 0;
    
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                count++;
            }
        });
        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                count++;
            }
        });
        // 启动线程 t1 和 t2
        t1.start();
        t2.start();
        // 等待线程 t1 和 t2 工作完成
        t1.join();
        t2.join();
        // 打印 count 的值
        System.out.println("count = " + count);
    }
}

        我们代码想让变量 count  自增 10w 次,最终得到的结果应该是 count = 100000,但是由上面的四次执行结果可以看出,这四次的结果都不一样,并且都没有得到正确的结果,所以上面这个循环自增的代码就是存在线程安全问题的代码。

二、线程安全概念

        观察完线程不安全的示例后,我来介绍一下线程安全,我们可以认为,某个代码,无论是在单个线程下执行,还是多个线程下执行,都不会产生 bug ,这个情况就可以成为“线程安全”,但是如果这个代码,在单线程下运行正确,多线程下可能产生 bug ,这个情况就称为“线程不安全”,也就是“存在线程安

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值