线程如何工作

tur*_*ral 3 java multithreading

我有一个问题,了解线程如何工作:

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(); 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

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

是否有可能得到一个结果4-1 5-1 5-2 4-2?如果有,怎么样?

Mar*_*nik 13

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

有可能的.

如果有,怎么样?

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

所以,你必须理解的是语义synchronized:总是有一个明确定义的对象涉及其监视器获取.基本上,该对象指出哪个线程已获取其监视器并且只允许相同的线程重新获取它; 其他线程将被暂停,直到监视器被释放.当然,任何其他对象都与此无关,它的监视器可以被任何线程自由获取.

synchronized方法隐含地使用this的锁.您可以为您的示例做的是在您的方法中声明static final Object lock = new Object();并使用synchronized(lock)它.