往期回顾:
❀❀多线程(一):认识和创建一个线程❀❀
❀❀多线程(二):Thread类的常见方法❀❀
synchronized解决线程不安全
一. 为什么会出现线程不安全
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 举报,一经查实,本站将立刻删除。