2013-07-07 3 views
1

Я имею проблему, чтобы понять следующую программу в главе 9 (нитей) из SCJP книги K & BSCJP Thread Глава вопрос

ВОПРОС:

class Dudes{ 
    static long flag = 0; 
    // insert code here 
    void chat(long id){ 
     if(flag == 0) 
      flag = id; 
     for(int x = 1; x < 3; x++){ 
      if(flag == id) 
       System.out.print("yo "); 
      else 
       System.out.print("dude "); 
     } 
    } 
} 
public class DudesChat implements Runnable{ 
    static Dudes d; 
    public static void main(String[] args){ 
     new DudesChat().go();  
    } 
    void go(){ 
     d = new Dudes(); 
     new Thread(new DudesChat()).start(); 
     new Thread(new DudesChat()).start(); 

    } 
    public void run(){ 
     d.chat(Thread.currentThread().getId()); 
    } 
} 

И учитывая эти два фрагмента:

I. synchronized void chat (long id){ 
      II. void chat(long id){ 

ВАРИАНТЫ:

When fragment I or fragment II is inserted at line 5, which are true? (Choose all that apply.) 
A. An exception is thrown at runtime 
B. With fragment I, compilation fails 
C. With fragment II, compilation fails 
D. With fragment I, the ouput could be yo dude dude yo 
E. With fragment I, the output could be dude dude yo yo 
F. With fragment II, the output could be yo dude dude yo 

Официальный Ответ F (Но я не могу понять, почему, было бы очень признателен, если кто-то может объяснить мне концепцию)

ответ

2

Рассмотрим следующий сценарий:

Thread 1 ID: 1
резьбы 2 ID: 2
следующие шаги займет место:
резьбы 1 получает цикл ЦП и выполняет chat(1)
флаг = 1
х = 1: поскольку флаг == 1 такпечатается
Thread 1 выгружается Нитями 2
Тема 2 получает цикл процессора и выполняет chat(2)
флаг = 1 (не 2, поскольку flag==0 условие не выполняется)
х = 1: так как флаг = 2 так dude будут напечатаны
х = 2: так как флаг = 2 так dude будет печататься
Thread 1 получает цикла CPU
флаг = 1
х = 2: поскольку флаг == 1 так yo будет печататься.


Hence the output is `yo dude dude yo` 
+0

Спасибо большое :) –

+0

но чат синхронизирован. как поток 2 может обрабатываться, пока поток 1 не будет прерван? есть только один объект Dude (статический), поэтому 2 потока пытаются создать один объект – grep

+0

, если синхронизированный выход чата будет: yo лет чувак чувак – grep

0

, если чат будет синхронизировано, выход будет

yo yo dude dude 

Существует один объект Dudes, он объявлен как статический; У нас есть один объект, 2 потока и 1 синхронизированный метод; если метод чата будет синхронизирован, два потока не смогут получить доступ к совместному методу класса.

, если чат не будут синхронизированы, вы не обнаружит ответ (не будет же ответы, потому что два потока вызываются вместе с тем состояние меняется в процессах каждого потока;