我的代码是:
public class Child extends Thread {
public void run(){
synchronized (this)
{
for(int i=1;i<=5;i++)
{
System.out.println("child thread");
}
}
}
}
class ThreadTest{
public static void main(String []a) {
Child child=new Child();
**child.start();**
synchronized (child)
{
for(int i=1;i<=5;i++)
{
System.out.println("parent thread");
}
}
}
}
它首先打印“父线程”之后打印“子线程”,但我怀疑是,当我们调用start()方法时,有机会在主线程之前调用子线程。但它总是在“子线程”之后打印“父线程”。可以解释一下吗?
答案 0 :(得分:0)
在child.start()
调用内的某个地方(即,在start()返回之前),新线程被创建,并且它有资格运行。从那时起,这是一场比赛,看看哪个线程将首先到达它的各个synchronized(...)
块。没有办法知道哪一个会赢,而且没有理由认为它每次都会成为同一个赢家。
P.S。:同步Thread
对象并不是一个好主意。 Thread
类也会在Thread
个实例上同步它们,并且存在使用Thread对象作为锁可能会干扰Thread类使用它的风险。
一个好习惯是在私人对象上进行同步。
class MyClass {
private final Object myLock = new Object();
SomeType someMethod(...) {
synchronized(myLock) {
....
}
}
}