第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

這是同步代碼塊的安全方法嗎?

這是同步代碼塊的安全方法嗎?

眼眸繁星 2023-06-08 19:28:57
在我們的應(yīng)用程序中,有一段代碼不斷運(yùn)行以讀取和調(diào)整文件。只是為了讓您了解正在發(fā)生的事情:public void run() {    try {        while(true) { //Yeah, I know...            Path currentFileName = getNextFile();            String string = readFile(currentFileName);            Files.deleteFile(currentFileName);            string = string.replaceAll("Hello", "Blarg");            writeFile(currentFileName);        }    } catch (Exception e) {        System.err.println("It's all ogre now.");        e.printStackTrace(System.err);    }}我們代碼中的其他地方有一個(gè)方法,它可能(但通常)不在與上述代碼相同的線程上運(yùn)行,我們用它來(lái)退出應(yīng)用程序。private void shutdown() {    if(fileReader != null)        fileReader = null;    System.exit(0); //Don't blame me, I didn't write this code}很明顯,此代碼中存在潛在的競(jìng)爭(zhēng)條件,如果在shutdown()檢索文件和寫(xiě)回文件之間調(diào)用 if ,則可能會(huì)導(dǎo)致文件完全丟失。顯然,這是不受歡迎的行為。這段代碼有上千個(gè)問(wèn)題(超出了我在這里展示的范圍),但我需要解決的主要問(wèn)題是處理文件可以中途中斷而沒(méi)有追索權(quán)的不良行為。我提出的解決方案涉及簡(jiǎn)單地將 while 循環(huán)包裝在一個(gè)塊中,并在調(diào)用synchronized周?chē)胖靡粋€(gè)塊。System.exitshutdown所以我更改后的代碼如下所示:private Object monitor = new Object();public void run() {    try {        while(true) {            synchronized(monitor) {                Path currentFileName = getNextFile();                String string = readFile(currentFileName);                Files.deleteFile(currentFileName);                string = string.replaceAll("Hello", "Blarg");                writeFile(currentFileName);            }        }    } catch (Exception e) {        System.err.println("It's all ogre now.");        e.printStackTrace(System.err);    }}private void shutdown() {    synchronized(monitor) {        if(fileReader != null)            fileReader = null;         System.exit(0);    }}我主要擔(dān)心的是System.exit(0);電話,我不確定電話幕后的總體行為。System.exit是否存在將釋放鎖的副作用的風(fēng)險(xiǎn)monitor,從而導(dǎo)致循環(huán)內(nèi)容在導(dǎo)致 JVM 停止run之前被部分執(zhí)行的風(fēng)險(xiǎn)?System.exit還是這段代碼會(huì)保證執(zhí)行過(guò)程永遠(yuǎn)不會(huì)在處理單個(gè)文件時(shí)嘗試中途關(guān)閉?注意:在一些紙上談兵的程序員介入替代方案之前,我想指出,我在這里放置的是大約 4000 行代碼的截?cái)喟姹?,所有代碼都隱藏在一個(gè)類(lèi)中。是的,這太可怕了。是的,這讓我后悔我選擇的職業(yè)。我不是在這里尋找這個(gè)問(wèn)題的替代解決方案,我只是想確定這個(gè)特定的解決方案是否有效,或者是否存在一些嚴(yán)重的缺陷會(huì)阻止它像我預(yù)期的那樣工作。
查看完整描述

4 回答

?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

還是這段代碼會(huì)保證執(zhí)行過(guò)程永遠(yuǎn)不會(huì)在處理單個(gè)文件時(shí)嘗試中途關(guān)閉?

此代碼保證此處啟動(dòng)的關(guān)閉不會(huì)在處理單個(gè)文件的過(guò)程中發(fā)生。也許很明顯,您代碼中的其他地方可以調(diào)用System.exit,而您對(duì)此沒(méi)有任何保護(hù)。

您可能需要考慮防止System.exit被調(diào)用,然后讓您的代碼正常關(guān)閉(即通過(guò)方法的正常完成main)。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

萬(wàn)一你真的有多個(gè)線程調(diào)用不同的方法,synchronized這樣使用實(shí)際上是一個(gè)聰明的主意,因?yàn)樗幚砹恕岸嗑€程”的事情。


您可以考慮縮小第一個(gè)塊的范圍:


Path currentFileName = getNextFile();

String string = readFile(currentFileName);

synchronized(monitor) {

單獨(dú)讀取文件應(yīng)該不是問(wèn)題。(當(dāng)然,除非您此處的代碼必須保證由 返回的 PathgetNextFile()得到完全處理)。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
慕無(wú)忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊

如果代碼在synchronized塊中執(zhí)行并且塊在同一個(gè)對(duì)象上同步,并且synchronized循環(huán)中塊中調(diào)用的方法while完全在與其調(diào)用者相同的線程上運(yùn)行,則不存在文件相關(guān)進(jìn)程被中斷的風(fēng)險(xiǎn)通過(guò)調(diào)用System.exit. _

這就是說(shuō),它看起來(lái)確實(shí)像是一個(gè)有爭(zhēng)議的補(bǔ)丁,只是稍微改進(jìn)了有爭(zhēng)議的代碼。

可能還存在更具體的饑餓風(fēng)險(xiǎn),因?yàn)轱@示的 while 循環(huán)似乎盡可能快地向這些文件操作發(fā)送垃圾郵件,因此在退出時(shí)嘗試獲取鎖可能不會(huì)成功。

探索的一般方向是將無(wú)限while循環(huán)轉(zhuǎn)換為ScheduledExecutorServiceRunnable,使用自己的監(jiān)視器執(zhí)行每 x 時(shí)間量以防止對(duì)相同文件的重疊操作,并在shutdown調(diào)用該方法時(shí)優(yōu)雅地終止它。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊

您可以使用關(guān)閉掛鉤。來(lái)自 javadocs:

關(guān)閉掛鉤只是一個(gè)已初始化但未啟動(dòng)的線程。當(dāng)虛擬機(jī)開(kāi)始其關(guān)閉序列時(shí),它將以某種未指定的順序啟動(dòng)所有已注冊(cè)的關(guān)閉掛鉤,并讓它們同時(shí)運(yùn)行。

由此,您可以從您的文件類(lèi)中提供一個(gè)關(guān)閉掛鉤,如下所示:

public Thread getShutdownHook() {

? ? return new Thread(() -> {

? ? ? ? synchronized (monitor) {

? ? ? ? ? ? // gracefully handle the file object

? ? ? ? }

? ? });

}

這將在調(diào)用時(shí)調(diào)用Runtime.getRuntime().exit()(由 調(diào)用System.exit())。由于它也在監(jiān)視器對(duì)象上同步,如果其他線程正在使用該文件,關(guān)閉掛鉤將阻塞直到它空閑為止。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
  • 4 回答
  • 0 關(guān)注
  • 212 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)