1

我在理解 SCJP 书籍 K&B 第 9 章(线程)中的以下程序时遇到问题

问题:

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(但我不明白为什么,如果有人能解释一下这个概念,我将不胜感激)

4

2 回答 2

2

考虑以下场景:

线程 1 ID : 1
线程 2 ID : 2
将发生以下步骤:
线程 1 获得 CPU 周期并执行chat(1)
flag=1
x = 1 : 因为 flag == 1 所以yo被打印
线程 1 被线程 2 抢占
线程 2 获得 CPU 周期并执行chat(2)
flag = 1(不是 2,因为flag==0条件失败)
x = 1:因为 flag!=2dude将被打印
x = 2:因为 flag!=2 所以dude 将被打印
线程 1 获取 CPU 周期
标志 = 1
x = 2 : 因为 flag == 1 所以yo会被打印出来。


Hence the output is `yo dude dude yo`
于 2013-07-07T16:48:26.277 回答
0

如果聊天将被同步,输出将是

yo yo dude dude 

Dudes 有一个 Object,它被声明为 static;我们有一个对象,2个线程和1个同步方法;如果聊天方法将被同步,两个线程不能一起访问类同步方法。

如果聊天不同步,则不会检测到答案(不会有相同的答案,因为两个线程一起调用,所以状态在每个线程的过程中都在变化;

于 2016-04-10T18:53:58.277 回答