首页 新闻 会员 周边

关于java的多线程的疑问 ??

0
[待解决问题]

两个线程 执行 n = n + 1 ( n 为 100) , 教程中说 ,Thread1 如果在 ILOAD(100) 执行后被操作系统中断 , Thread2 就会读取成 100 而并不是 101 ,所以最后两个线程执行后的结果是 101 而不是 102 。

我的疑问是 : 就算操作系统不中断 , 也会有可能导致 Thread2 读取的是100 吧 ,比如 Thread1 执行完 ILOAD(100) 紧接着 Thread2 就开始执行 , 对不对 ?

春风十里不如你Ni的主页 春风十里不如你Ni | 初学一级 | 园豆:186
提问于:2023-12-13 20:42

这个从汇编看就能明白了,左值先取值100了,如图。然后其他线程不管怎么操作也改变不了左值已经是100这个值了,这个java线程栈有一定关系,栈之间相互独立

无敌旋律 4个月前
< >
分享
所有回答(3)
0

您提出的问题涉及到多线程并发执行时的竞态条件(Race Condition)问题。在并发编程中,如果两个或多个线程访问共享的数据,并且其中至少一个线程对数据进行写操作,就可能发生竞态条件。竞态条件可能导致意外的结果,因为线程执行的顺序不确定。

在您描述的情境中,两个线程执行 n = n + 1 操作,而且初始值是 n = 100。如果 Thread1 在执行 ILOAD(100) 后被操作系统中断,而此时 Thread2 开始执行,那么 Thread2 将读取 n 的值,这时 n 的值为 100。然后 Thread2 执行 n = n + 1 操作,将 n 的值增加到 101。接着,如果 Thread1 继续执行,它将读取之前保存的 n 的值(100)并执行 n = n + 1,将 n 的值增加到 101。

因此,在这种情况下,最终的结果是 101 而不是 102。这是由于并发执行导致的竞态条件,即多个线程同时访问并修改共享的数据,而执行顺序的不确定性导致了最终结果的不同。

在不同的执行时序下,最终结果可能是 101 或 102,这是由于并发执行的不确定性造成的。这种情况下,通常需要使用同步机制(例如锁)来确保在多线程环境下对共享数据的安全访问。

Technologyforgood | 园豆:5675 (大侠五级) | 2023-12-13 22:05

你是机器人吧

支持(1) 反对(0) 春风十里不如你Ni | 园豆:186 (初学一级) | 2023-12-13 22:31
1

一个意思,
“ 比如 Thread1 执行完 ILOAD(100) 紧接着 Thread2 就开始执行 ”
不就是
“ Thread1 在 ILOAD(100) 执行后被中断 ”、 “ Thread2 就会读取成 100 而并不是 101 ”
这不是一个意思吗,在疑惑啥
Thread1读取数据后,还没改变数据,被中断,执行Thread2,然后结果不就如图

蜂歌的小弟 | 园豆:188 (初学一级) | 2023-12-14 22:03

“被中断” 的意思是不是操作系统暂停执行当前线程, 转而去 执行其他线程了 ,然后过一会儿又回来执行当前线程 ?

支持(0) 反对(0) 春风十里不如你Ni | 园豆:186 (初学一级) | 2024-01-04 14:41
0

这个从汇编看就能明白了,左值先取值100了,如图。然后其他线程不管怎么操作也改变不了左值已经是100这个值了,这个java线程栈有一定关系,栈之间相互独立

无敌旋律 | 园豆:206 (菜鸟二级) | 2023-12-15 13:59

汇编有线程栈的概念吗 ? 可以推荐一本书吗 ?

支持(0) 反对(0) 春风十里不如你Ni | 园豆:186 (初学一级) | 2024-01-10 10:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册