直接看个例子:
public class HelloSogou{
public static synchronized void main(String[] a){
Thread t=new Thread(){
public void run(){
Sogou();
}
};
①t.run();//②t.start()
System.out.print("Hello");
}
static synchronized void Sogou(){
System.out.print("Sogou");
}
}
两处不一样的区别:
①处:调用run时只是单纯执行方法,故按代码顺序执行下来结果就是SogouHello。
②处:首先调用start()是开始了一个线程,那么现在程序中有了两个线程主线程main和线程t;这就涉及到:函数使用的锁是this(即对象本身),还是:若函数被static修饰则锁为类名.class。那么题目中两个函数都是使用了同一个锁即HelloSogou.class,当执行t.start()时,t线程准备调用Sogou方法,但是锁对象已被主线程占用,故要等待主线程执行完System.out.print("Hello")后释放锁才可以执行自己的Sogou方法。故此结果是HelloSogou