-2

これらのメソッドが 2 つの異なるスレッドから同時に呼び出された場合、結果はどうなりますか?

public class FirstWord {
       public static synchronized void writeFirstWord(boolean fromSecondWord) throws Exception {
              if(fromSecondWord == false)
                     SecondWord.writeSecondWord();
              System.out.print("Redflex"); }}

public class SecondWord {
       public static synchronized void writeSecondWord() throws Exception {
              Thread.sleep(100);
              FirstWord.writeFirstWord(true);  
              System.out.print(" Traffic Systems"); }}
4

4 に答える 4

1

あなたが持っているコードサンプルではデッドロックが発生する可能性が非常に高いです.ThreadAとThreadBなどの2つのスレッドがある場合、次のシナリオが与えられます:

ThreadA が呼び出さFirstWord.writeFirstWord(false)れ、スレッドが ThreadB 呼び出し内で 1 回一時停止しSecondWord.writeSecondWord()、スレッドが内部で 1 回一時停止する

ThreadB が SecondWord をロックしているため、ThreadA は停止しますSecondWord.writeSecondWord();

ThreadA が FirstWord をロックしているため、ThreadB は続行できません。

その結果、デッドロックが発生します。

これがこのコードの唯一の可能な結果ではないことに注意してください - タイミングなどによっては、コードはしばらくの間問題なく動作するかもしれませんが、ある時点でデッドロックに陥る可能性が非常に高いです。

于 2013-02-18T09:51:15.050 に答える
0

の予測不可能な性質により、結果は予測できませんsleep()

また、コアの数と、呼び出しで指定するパラメーターによっても異なりますwriteFirstWord(boolean)

詳細はお任せします:-)


ヒント: 1 つの可能性はデッドロックです。

于 2013-02-18T09:29:53.320 に答える
0
package com.blt;

    public class ThreadsExample implements Runnable { 
       public static void main(String args[]) {     
        Thread t=new Thread(new ThreadsExample());
        Thread t1=new Thread(new ThreadsExample());     
        t.start();
        t1.start();      
}

    public void run()  {    
    try { 
        writeSecondWord();  
    }   
    catch(Exception e)  {   
      e.printStackTrace();  
    }
 }

    public static synchronized void writeSecondWord() throws Exception {
        Thread.sleep(100);
        writeFirstWord(true);  
        System.out.print(" Traffic Systems"); 
        } 

    public static synchronized void writeFirstWord(boolean fromSecondWord) throws Exception {
        if(fromSecondWord == false)
               writeSecondWord();
        System.out.print("Redflex"); 
     }
 }

出力は次のとおりです。Redflex Traffic SystemsRedflex Traffic Systems

コードの上で実行することは問題ありませんが、コードがある時点でデッドロックを引き起こす可能性がかなりあります。

于 2013-02-18T10:14:08.490 に答える