3

我在理解线程如何工作时遇到问题:

class ThreadTest implements Runnable{ 
    synchronized void methodA(long n){ 
        for (int i=1;i<3;i++){System.out.print(n+" "+i)} 
    } 

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

    public static void main(String ... args){ 
        new Thread(new ThreadTest()).start(); 
        new Thread(new ThreadTest()).start(); 
    } 
} 

据我目前的理解,因为methodA在这个方法中是一个同步的for循环,它必须在下一个线程调用这个方法之前完成——所以结果必须像4-1 4-2 5-1 5-2...

是否有可能得到类似的结果4-1 5-1 5-2 4-2?如果是,如何?

4

2 回答 2

13

是否有可能得到像 4-1 5-1 5-2 4-2. 这样的结果?

有可能的。

如果是怎么办?

您正在使用该this引用作为被锁定的对象synchronized。由于您有两个不同的实例ThreadTest,因此每个方法都会锁定自己的实例,并且无法实现互斥。

所以,你必须了解的是 的语义synchronized:总是有一个明确定义的对象,它的监视器获取。基本上,该对象会记录哪个线程已经获取了它的监视器,并且只允许同一个线程重新获取它;其他线程将被搁置,直到监视器被释放。任何其他对象自然与此无关,并且它的监视器可以被任何线程自由获取。

一种synchronized方法隐式this用于锁定。您可以为您的示例做的是在您的方法中声明static final Object lock = new Object();和使用synchronized(lock)

于 2013-05-18T18:35:21.267 回答
1

你可以得到结果 4-1 5-1 5-2 4-2 。另外你可能会得到 5-1 5-2 4-1 4-2 因为你不能保证哪个线程会运行。线程启动只会放可运行列表中的那个线程。线程调度程序将决定运行哪个线程

于 2013-05-18T18:37:53.287 回答