一、线程安全性问题:
1).当多个线程共同访问同一个资源(变量、数组、集合对象、文件、数据库...),由于Java内部线程工作的机制问题,可能会导致:
多个线程访问同一个资源,最终的结果是错误的。
2).多线程内存运行机制:
每个线程在"栈"中都会有一个独立的"栈区",每个线程在各自栈区中独立运行,互不干扰。
见图2
3).当多个线程访问同一个资源时,可能产生的安全性问题主要有以下三种:
1).对一个变量访问的:可见性问题:见demo01,图03
2).对一个变量访问的:有序性问题:见:图04
当"编译器"编译代码时,为了提高效率,在不更改最终结果的前提下,可能会对代码进行"重排"——打乱了代码的原顺序
例如:
我们源码: 编译时:
int a = 10; int b = 20;
int b = 20; int a = 10;
int c = a + b; int c = a + b;
但是在"多线程"情况下,如果两个线程,一样的执行过程,由于代码重排,就会导致两次的结果不同。
3).对一个变量访问的:原子性问题:见demo02,图05
二、volatile关键字:
1.volatile关键字用于修饰"变量",可以保证变量的:可见性、有序性。但不能解决"原子性"问题。
例如:解决:可见性
public static volatile boolean flag = false;
例如:解决:有序性:见图4
public volatile int a = 0;
public volatile boolean b = false;
...
public void show1(){
a = 1;
b = t
线程安全问题
最新推荐文章于 2024-07-10 18:12:15 发布
本文详细探讨了Java中的线程安全问题,包括可见性、有序性和原子性问题,并介绍了volatile关键字的作用。同时,讲解了如何使用原子类如AtomicInteger解决原子性问题,以及synchronized关键字在同步代码块和同步方法中的应用。此外,还提到了Lock锁作为synchronized的替代方案,并讨论了线程安全的集合类如CopyOnWriteArrayList和ConcurrentHashMap。
摘要由CSDN通过智能技术生成