Java之多线程安全(屌丝版,两大解决思路,要么不去竞争(开辟线程副本)、要么有顺序的竞争资源(用锁规定线程秩序))

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cadi2011/article/details/84837911

0、多线程安全,如果多个线程操作一个变量,每次都能达到预期的结果,那么说明当前这个类起码是线程安全的,我这白话的,可能有点恶心。

1、看看牛人是怎么说的,为什么多线程并发是不安全的?

在操作系统中,线程是不再拥有资源的,进程是拥有资源的。而线程是由进程创建的,一个进程可以创建多个线程,这些线程共享着进程中的资源。所以,当线程一起并发执行时,同时对一个数据进行修改,就有可能造成数据不一致,因为A和B线程拿到数据时的状态是不一样的

这个例子比较好

int number = 0;

该字段number

有两个线程共享它,并同时去修改它,每个线程去给它+1

你的预期是number == 2

但是真实结果可能是1

原因:
a、第一个线程计算时拿到number是0,然后给它+1,计算时结果是1
b、第二个线程计算时拿到的number也是0,而不是1,因为是并行的,内存中的number还是0,也进行一次计算后,number还是 == 1

c、理想预期是第二个线程拿到第一个线程计算后的结果,即拿到的就是1,再去计算一下,结果 number == 2

当第一个线程将结果写回到内存中的 number 后,第二个线程也将结果写回到内存中的number中去,这就会把第一个线程的计算结果给覆盖了,所以最终的结果还是1

2、怎么解决上面的并发问题?

思路1:给共享的数据,加把锁,每次哪个线程拿到锁,才能操作

思路2:让线程也拥有数据,不去共享进程中的数据

3、思路1

使用锁机制、synchronized

使用Lock

使用java.util.concurrent下的线程安全的集合类

4、思路2

使用ThreadLocal,把共享的资源,在线程对象中,再开辟一份独立的,成为线程私有变量,这样的话,别的线程就算修改类共享的变量,你自己的资源一点也不受影响,既满足了你需要的资源,又不会引起并发问题,完美的解决方案啊,大神牛逼

猜你喜欢

转载自blog.csdn.net/cadi2011/article/details/84837911