使用多線程的時候,除了因為操作共享數據帶來的安全問題,還有一個就是因為,為了避免安全問題去使用同步,但是因為同步使用不當而產生的死鎖問題。
例子:
public class DeadLockDemo { public static void main(String[] args) { Data data = new Data(); new Thread(new RunnableA(data)).start(); new Thread(new RunnableB(data)).start(); } }class RunnableA implements Runnable{ Data data; public RunnableA(Data data){ this.data = data; } public void run() { synchronized(this){ System.out.PRintln(data.i--); synchronized(data){ System.out.println(data.i--); } } } }class RunnableB implements Runnable{ Data data; public RunnableB(Data data){ this.data = data; } public void run() { synchronized(this){ System.out.println(data.i--); synchronized(data){ System.out.println(data.i--); } } } }class Data { public int i = 100;}發生死鎖的原因:同步代碼塊的嵌套。同步代碼塊互相嵌套會發生互相所要鎖的問題,如果一個線程拿到了A鎖等B鎖,另一個線程拿到了B鎖等A鎖,那么程序就會堵死,執行不下去,這就是死鎖。
上面的例子舉的不是很好。因為死鎖這問題,在編寫多線程的時候規范,一般不會出現的。就算出現了,知道原因,根據原因去查哪里寫的不規范就可以了。
新聞熱點
疑難解答