最新回答 / qq_慕設(shè)計(jì)1559327
as-if-serial:無(wú)論如何重排序,程序執(zhí)行的結(jié)果應(yīng)該與代碼順序執(zhí)行的結(jié)果一致。很明顯,2.1和2.2,進(jìn)行重排后,結(jié)果都是一樣的翻譯搜索復(fù)制
最新回答 / 一個(gè)愛(ài)西瓜的小伙
synchronized分為對(duì)象鎖和類鎖。加在非靜態(tài)方法上的鎖是對(duì)象鎖,由于main中new了兩個(gè)實(shí)例,write和read方法是不同對(duì)象,因此兩個(gè)鎖不是同一把鎖,不具有互斥性。所以出現(xiàn)0和6的原因就是出現(xiàn)在處理器的重排序原因。兩個(gè)線程同時(shí)啟動(dòng),但是先執(zhí)行哪個(gè)線程是有處理器決定的。如果是讀線程先執(zhí)行,結(jié)果就是0;如果是寫線程先執(zhí)行就是6;如有問(wèn)題請(qǐng)指正。
最贊回答 / iceWang
一個(gè)或某幾個(gè)操作只能在一個(gè)線程執(zhí)行完之后,另一個(gè)線程才能開(kāi)始執(zhí)行該操作,也就是說(shuō)這些操作是不可分割的,線程不能在這些操作上交替執(zhí)行文中的 i++ 包括 3 個(gè)操作讀取 i 的值i 的值 +1?將 i 賦值給 i在這 3 個(gè)操作中可能會(huì)有其他線程開(kāi)始執(zhí)行,因此不是原子性的
2019-01-20
已采納回答 / 特南克斯
main 線程是會(huì)和? new 出來(lái)的線程并行執(zhí)行的,如果沒(méi)有那個(gè) while 判斷,下面這行代碼<...code...>就會(huì)在其他線程執(zhí)行完之前就執(zhí)行了。加 while 判斷,就是為了等五百個(gè)線程執(zhí)行完畢
2018-10-14
最贊回答 / 慕前端6229441
共享變量是在多線程操作的情況下,對(duì)某一個(gè)變量都有進(jìn)行操作,該變量存儲(chǔ)在主存中,但是在多線程的工作內(nèi)存中都有一個(gè)副本,所以該變量是共享的,即為共享變量。
volatile變量是被該關(guān)鍵字修飾的變量。在單線程中也可以用來(lái)修飾變量,但是沒(méi)有意義。用在多線程中,是為了保證被其修飾的變量對(duì)于多線程來(lái)說(shuō)都是內(nèi)存可見(jiàn)的。
在多線程中,volatile用來(lái)修飾共享變量,實(shí)現(xiàn)共享變量的可見(jiàn)性。
2018-08-12