鲁班学院java源码学习

在统一程序中运行多个线程自己不会导致问题,问题在于多个线程接见了相同的资源。如,统一内存区(变量,数组,或工具)、系统(数据库,web services等)或文件。现实上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是平安的。

多线程同时执行下面的代码可能会失足:

java高级培训,Java竞态条件与临界区,java源码学习,鲁班学院

想象下线程A和B同时执行统一个Counter工具的add()方式,我们无法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条指令来执行的,而是根据下面的顺序:

从内存获取 this.count 的值放到寄存器
将寄存器中的值增添value
将寄存器中的值写回内存

考察线程A和B交织执行会发生什么:

,

联博统计

www.weqvip.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,

java高级培训,Java竞态条件与临界区,java源码学习,鲁班学院

两个线程划分加了2和3到count变量上,两个线程执行竣事后count变量的值应该即是5。然而由于两个线程是交织执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并划分写回内存。最终的值并不是期望的5,而是最后写回内存的谁人线程的值,上面例子中最后写回内存的是线程A,但现实中也可能是线程B。若是没有接纳合适的同步机制,线程间的交织执行情况就无法预料。

竞态条件 & 临界区

当两个线程竞争统一资源时,若是对资源的接见顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。上例中add()方式就是一个临界区,它会发生竞态条件。在临界区中使用适当的同步就可以制止竞态条件。