概述
多线程虽然是更轻量的(相比于多进程来说)来完成了并发编程。但是多个线程是访问同一份内存资源的。并且线程是一个“抢占式”执行的过程(这些线程谁先执行,谁后执行,完全取决于系统的调度器),由于这里的不确定性太多,就可能会导致多个线程在访问同一个资源的时候,出现bug~“线程安全问题”。
举个例子:在一个桌子上放着一盘鸡肉,张三和李四老铁,同时看上了一个鸡大腿,两个人都要去抢这个鸡大腿,这个时候,两人就可能会打起来。
就好比线程1和线程2同时争夺一个资源,就会发生线程不安全问题。
那么这里的“访问” 是啥意思呢?访问分为读和写。
1.如果 多个线程只是进行读操作~ ,那么就不会有线程安全问题~ 就好比张三和李四同时看上了鸡大腿,但是他们只是看看,不吃,这就无所谓。
2.如果 多个线程涉及到写操作~,就会有线程安全问题 ~ 张三和李四都想吃,就会产生矛盾,发生问题。
线程不安全代码演示:
两个线程同时修改一个变量;
public class TestDemo {
static class Counter{
public int count = 0;
public void add(){
count++;
}
}
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
Thread t1 = new Thread(){
@Override
public void run() {
for (int i = 0; i < 50000; i++) {
counter.add();
}
}
};
Thread t2 = new Thread(){