多线程(三):synchronized解决线程不安全

往期回顾:
❀❀多线程(一):认识和创建一个线程❀❀
❀❀多线程(二):Thread类的常见方法❀❀


一. 为什么会出现线程不安全

1. 什么是线程不安全

简单来说:如果多线程环境下代码运行的结果总是符合我们预期的,就说明这个程序是线程安全的.

2. 演示线程不安全

public class SafeThread {
    private static int i = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread thread0 = new Thread(){
            @Override
            public void run() {
                for (; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+ ": i = " + i);
                }
            }
        };
        Thread thread1 = new Thread(){
            @Override
            public void run() {
                for (; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+ ": i = " + i);
                }
            }
        };
        thread0.start();
        thread1.start();
        thread0.join();
        thread1.join();
        System.out.println("i = " + i);
    }
}

输出结果:

在这里插入图片描述


可以发现,程序的输出与我们预期的输出结果不符合,当i < 10时,程序应该结束循环,但是输出i值却为11,说明程序出现问题,这就是多线程并行运行中所带来的问题.

3. 线程不安全的原因

1.线程之间抢占式执行
2.修改共享数据
3.某些操作不满足原子性
4.内存可见性(可见性: 一个线程对共享变量值的修改,能够及时地被其他线程看到)
5.指令重排序

三. 利用synchronized解决线程不安全

1.synchronized的特性

1.互斥

使用synchronized加锁的代码块会互斥的访问,当一个线程获得锁

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...