t.println ("synchronizedMethod1 done"); 10. 11. 12. public synchronized void synchronizedMethod2() { }
13. ; 14. 15. 16. 17. 18. 19.
System.out.println ("synchronizedMethod2 called")
try { Thread.sleep (1000); } catch (InterruptedException e) { e.printStackTrace (); } System.out.println ("synchronizedMethod2 done");
20. 21.
} }
1. public class MyThread extends Thread { 2. private int id = 0; 3. private Common common; 4. 5. public MyThread (String name, int no, Common object) { 6. super(name); 7. common = object; 8. id = no; 9. } 10. 11. 12. public void run () { System.out.println ("Running Thread" + this.getNa
me ()); 13. 14. try { if (id == 0) {
15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
common.synchronizedMethod1(); } else { common.synchronizedMethod2(); } } catch (Exception e) { e.printStackTrace (); } }
public static void main (String[] args) { Common c = new Common (); MyThread t1 = new MyThread ("MyThread-1", 0, c);
27.
MyThread t2 = new MyThread ("MyThread-2", 1, c);
28. 29. 30. 31.
10.什么是死锁
t1.start (); t2.start (); } }
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况 可能发生在当两个线程尝试获取其它资源的锁, 而每个线程又陷入无限等待其它资源锁 的释放, 除非一个用户进程被终止。 JavaAPI 而言, 就 线程死锁可能发生在一下情况。
? 当两个线程相互调用 Thread.join () ? 当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必需的锁,互相
等待时被阻塞就有可能出现死锁。 11.什么是线程饿死,什么是活锁? 线程饿死和活锁虽然不想是死锁一样的常见问题, 但是对于并发编程的
设计者来说就像 一次邂逅一样。 当所有线程阻塞, 或者由于需要的资源无效而不能处理, 不存在非阻塞线程使资源可用。 JavaAPI 中线程活锁可能发生在以下情形:
? 当所有线程在程序中执行 Object.wait (0),参数为 0 的 wait 方法。程序将发
生活锁直到在相应的对象上有线程调用 Object.notify ()或者 Object.notifyAll ()。
? 当所有线程卡在无限循环中。
这里的问题并不详尽,我相信还有很多重要的问题并未提及,您认为还有哪些问题应该 包括在上面呢?欢迎在评论中分享任何形式的问题与建议。