首页 理论教育 Java服务端研发|线程冲突问题解析

Java服务端研发|线程冲突问题解析

时间:2023-11-22 理论教育 版权反馈
【摘要】:在上面的几个例子中,都会为每个线程创建独立的任务单元,目前看来执行的情况良好。设想一种情况,如果传入多个线程中的任务单元是相同的,并且使用了同一份数据,那么会发生什么?代码如下:运行结果如下:main thread sum=499500pool-1-thread-1 sum=499500pool-1-thread-2 sum=499500pool-1-thread-3 sum=499500pool-1-thread-1 sum=499500pool-1-thread-4 sum=499500pool-1-thread-2 sum=499500pool-1-thread-6 sum=499500pool-1-thread-7 sum=499500pool-1-thread-5 sum=327769pool-1-thread-8 sum=743833代码中创建了一个ThreadConflict的对象,这个对象包含一个sum字段和一个求和的方法。把这个对象的执行任务传入线程池进行计算,结果有的线程执行结果是错误的。

Java服务端研发|线程冲突问题解析

在上面的几个例子中,都会为每个线程创建独立的任务单元,目前看来执行的情况良好。设想一种情况,如果传入多个线程中的任务单元是相同的,并且使用了同一份数据,那么会发生什么?代码如下:

运行结果如下:

main thread sum=499500

pool-1-thread-1 sum=499500

pool-1-thread-2 sum=499500

pool-1-thread-3 sum=499500

pool-1-thread-1 sum=499500

pool-1-thread-4 sum=499500(www.xing528.com)

pool-1-thread-2 sum=499500

pool-1-thread-6 sum=499500

pool-1-thread-7 sum=499500

pool-1-thread-5 sum=327769

pool-1-thread-8 sum=743833

代码中创建了一个ThreadConflict的对象,这个对象包含一个sum字段和一个求和的方法。把这个对象的执行任务传入线程池进行计算,结果有的线程执行结果是错误的。

Java的多线程执行是抢占式的,当多个线程同时抢占同一资源进行运算时,有可能线程A运算到一半时线程B抢占了线程A重新开始计算,线程B计算完毕线程A抢占回资源继续运算,这时就会发生了错误,因为线程A抢占回的资源数据已经不是它离开时的数据了。在这种情况下,可以使用锁解决并发导致的资源抢占问题。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈