微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多线程(三):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加锁的代码块会互斥的访问,当一个线程获得锁

原文地址:https://www.jb51.cc/wenti/3285945.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐