2013-02-18 2 views
-2

Если эти методы вызывают из двух разных потоков одновременно, каков будет результат?2 метода вызывается из двух разных потоков одновременно - Java

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"); }} 
+0

что вы видите? –

+0

Почему вы не можете выполнить и посмотреть! – LGAP

+2

Домашнее задание много? – Gal

ответ

0

Результаты непредсказуемы из-за непредсказуемого характера sleep().

Кроме того, это зависит от того, сколько ядер есть и какой параметр вы предоставляете в вызове writeFirstWord(boolean).

Я оставлю вас, чтобы выяснить подробности :-)


Подсказка: одна возможность тупиковая.

0

Пример SSCCE (модифицированный):

public class ThreadTest { 

    public static void main(String[] args) { 
     new Thread() { 
      public void run() { 
       try { 
        FirstWord.writeFirstWord(false); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }.start(); 

     new Thread() { 
      public void run() { 
       try { 
        SecondWord.writeSecondWord(false); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }.start(); 
    } 

} 

class FirstWord { 
    public static synchronized void writeFirstWord(boolean fromSecondWord) throws Exception { 
     System.out.println("FirstWord start"); 
     Thread.sleep(100); 
     if (!fromSecondWord) SecondWord.writeSecondWord(true); 
     System.out.println("FirstWord end"); 
    } 
} 

class SecondWord { 
    public static synchronized void writeSecondWord(boolean fromFirstWord) throws Exception { 
     System.out.println("SecondWord start"); 
     Thread.sleep(100); 
     if (!fromFirstWord) FirstWord.writeFirstWord(true); 
     System.out.println("SecondWord end"); 
    } 
} 

Как вы можете увидеть консоли шоу:

FirstWord start 
SecondWord start 

Первый поток "входит" в FirstWord синхронизированного блока, а второй входит в SecondWord один. Затем, немного спящий, первый поток пытается войти в метод SecondWord и должен ждать, потому что второй поток имеет блокировку для этого метода.

В то время как это происходит, второй поток также ждет, чтобы получить другой замок, и именно поэтому оба потока блокируют и никогда не достигают «конца», как они никогда не получают оба замка.

Если вы удалите Thread.sleep в обоих методах, это может сработать. Как сказано, это непредсказуемо. Вы не можете знать, какой поток будет вводить первым.

1

Тупик очень вероятно, в образце кода у вас есть - если у вас есть 2 темы, говорят ThreadA и ThreadB, затем дал такой сценарий:

ThreadA вызывает FirstWord.writeFirstWord(false) и нить делает паузу однажды внутри ThreadB вызывает SecondWord.writeSecondWord() и тому нить приостанавливается один раз внутри

Теперь ThreadA продолжает останавливаться на SecondWord.writeSecondWord();, поскольку ThreadB имеет замок SecondWord.

ThreadB не может продолжаться, поскольку ThreadA имеет блокировку FirstWord.

Результатом является тупик.

Обратите внимание, что это не единственный возможный результат этого кода - в зависимости от времени и т. Д. Код может работать нормально, но очень вероятно, что вы в какой-то момент зашли в тупик.

0
  1. упаковка 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 Systems SystemsRedflex трафика

Бег выше код отлично, но есть справедливые шансы того, что код будет производить затор в какой-то момент времени.

Смежные вопросы