我在理解线程的工作原理时遇到了一个问题:
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这样的结果?如果是,是如何实现的?
发布于 2013-05-19 02:35:21
可以得到像4-1 5-1 5-2 4-2这样的结果吗?
这是可能的。
,如果是,如何实现?
您正在使用this引用作为被synchronized锁定的对象。因为您有两个不同的ThreadTest实例,所以每个方法都会锁定自己的实例,并且不会实现互斥。
因此,您必须理解synchronized的语义:总是有一个明确定义的对象涉及到它的监视器。基本上,该对象记录了哪个线程获得了它的监视器,并且只允许同一线程重新获得它;其他线程将被搁置,直到监视器被释放。当然,任何其他对象都与此无关,其监视器可由任何线程自由获取。
synchronized方法隐式地将this用于锁。对于您的示例,您可以做的是声明一个static final Object lock = new Object();并在您的方法中使用synchronized(lock)。
发布于 2013-05-19 02:37:53
你可以得到结果4-1 5-1 5-2 4-2 .Also你可能会得到5-1 5-2 4-1 4-2,因为你不能保证哪个线程会启动只会把那个线程放入可运行的list.Thread调度程序会决定运行哪个线程
https://stackoverflow.com/questions/16627610
复制相似问题