2011-12-29 34 views
-1

「我有一個XYZ類,我已經寫了兩個方法A和B,現在兩個線程在這個類的一個對象上運行,一個線程在A方法中,我希望只要第二個線程調用我的B方法,方法A中的線程應立即停止並出來,有人告訴我這個解決方案嗎?「立即停止線程作爲第二個線程需要訪問

+2

所以你希望你的數據結構一旦出現競態條件就會被破壞?哦,這很容易:刪除所有的鎖。更嚴重的是:你確實解決了錯誤的問題:更多的上下文。 – Voo 2011-12-29 17:24:10

+0

我認爲你沒有得到我的觀點我想在第二次嘗試輸入時立即停止第一個線程 – 2011-12-29 17:26:22

+0

共享方法沒有問題,因爲它們沒有改變(或者你沒有看到它們改變;)問題只是共享可變數據。我不擔心哪些線程在運行哪些方法,而是擔心共享數據何時被更改。 – 2011-12-29 17:26:33

回答

2

讓我直接回答你的問題,並告訴你爲什麼它是一個壞主意。

private Thread lastThread; 

public void transferMoney(Account account, Account account2, int amount) { 
    Thread t = lastThread; 
    if (t != null) 
     t.stop(); // so another thread running this immediately on a random line. 
    lastThread = Thread.currentThread(); 
    // lastThread could die here 
    if (account1.withdrawn(amount)) { // the withdraw was successful 
     // lastThread could die here 
     account2.deposit(amount); 
    } 
    // lastThread could die here 
    lastThread = null; 
} 

該代碼存在許多方面的缺陷,但是如果兩個線程輸入此方法,則第一個線程可能會停止。但是,它可能會使帳戶1缺少未轉移到帳戶2的資金。 (或更糟糕的)

簡而言之,讓一個線程殺死另一個線程是沒有意義的,事實上,您要儘量避免這種情況,所以以任何方式鼓勵它都不是好主意。

+1

pstt,你做了lastThread final。很確定你不是這個意思。 – Dunes 2011-12-29 17:45:02

+0

@彼得這是你的實現..有可能我們需要這種情況。謝謝你的回覆buddy – 2011-12-29 17:50:38

+0

@peter我可以有你的電子郵件ID嗎? – 2011-12-29 17:58:51