我在理解线程如何工作方面遇到了问题:
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
之类的结果?如果有,怎么样?
答案 0 :(得分:13)
是否可能有4-1 5-1 5-2 4-2的结果。?
有可能。
如果是,如何?
您使用this
引用作为synchronized
锁定的对象。由于您有两个不同的ThreadTest
实例,因此每个方法都会锁定自己的实例,并且无法实现互斥。
所以,你必须理解的是synchronized
的语义:总是有一个明确定义的对象,其监视器是获得。基本上,该对象指出哪个线程已获取其监视器并且只允许相同的线程重新获取它;其他线程将被暂停,直到监视器被释放。当然,任何其他对象都与此无关,它的监视器可以被任何线程自由获取。
synchronized
方法隐式使用this
进行锁定。您可以为您的示例做些什么,在您的方法中声明static final Object lock = new Object();
并使用synchronized(lock)
。
答案 1 :(得分:1)
你可以得到结果4-1 5-1 5-2 4-2。你也可能得到5-1 5-2 4-1 4-2,因为你不能保证哪个线程会运行。线程开始只会将该线程放入runnable list.Thread调度程序将决定运行哪个线程