作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我无法理解线程的工作原理:
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
这样的结果?如果是,如何?
最佳答案
Is it possible to have result like 4-1 5-1 5-2 4-2.?
这是可能的。
If yes how?
您正在使用 this
引用作为被 synchronized
锁定的对象。由于您有两个不同的 ThreadTest
实例,因此每个方法都锁定其自己的实例并且没有实现互斥。
因此,您必须了解synchronized
的语义:总是有一个明确定义的对象涉及其monitor acquired。基本上,该对象记录了哪个线程已经获得了它的监视器,并且只允许同一个线程重新获得它;其他线程将被搁置,直到监视器被释放。任何其他对象自然与此无关,它的监视器可以由任何线程自由获取。
synchronized
方法隐式使用 this
作为锁。您可以为您的示例做的是声明一个 static final Object lock = new Object();
并在您的方法中使用 synchronized(lock)
。
关于java - 线程如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627610/
我是一名优秀的程序员,十分优秀!