java并发之线程安全问题

时间:2021-07-23 21:30:56

并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务。

而Java并发则由多线程实现的。

在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中。(当然这是比较笼统的说法,线程之间是可以交互的,他们也不一定是串行。)

多线程的存在就是压榨cpu,提高程序性能,还能减少一定的设计复杂度(用现实的时间思维设计程序)。

多线程会引出很多难以避免的问题, 如死锁,脏数据,线程管理的额外开销,等等。更大大增加了程序设计的复杂度。

死锁脏数据就是典型的线程安全问题。

简单来说,线程安全就是: 在多线程环境中,能永远保证程序的正确性。

只有存在共享数据时才需要考虑线程安全问题。

解决线程安全问题:

如何解决的确是该流程的重点。目前分三种方式解决:

第一种,修改线程模型。即不在线程之间共享该状态变量。一般这个改动比较大,需要量力而行。

第二种,将对象变为不可变对象。有时候实现不了。

第三种,就比较通用了,在访问状态变量时使用同步。 synchronized和Lock都可以实现同步。简单点说,就是在你修改或访问可变状态时加锁,独占对象,让其他线程进不来。

这也算是一种线程隔离的办法。(这种方式也有不少缺点,比如说死锁,性能问题等等)

其实有一种更好的办法,就是设计线程安全类。《代码大全》就有提过,问题解决得越早,花费的代价就越小。

是的,在设计时,就考虑线程安全问题会容易的多。

首先考虑该类是否会存在于多线程环境。如果不是,则不考虑线程安全。

然后考虑该类是否能设计为不可变对象,或者事实不可变对象。如果是,则不考虑线程安全

最后,根据流程来设计线程安全类。

设计线程安全类流程:

1、找出构成对象状态的所有变量。

2、找出约束状态变量的不变性条件。

3、建立对象状态的并发访问管理策略。