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