23(多執行緒2)
阿新 • • 發佈:2018-12-06
1 休眠執行緒
2 守護執行緒
這個概念需要解釋一下,以象棋為例,非守護執行緒相當於帥,守護執行緒相當於車馬相士,當帥都沒了,車馬相士就失去了它的意義了,就是非守護執行緒停止了,守護執行緒也就gg了。
結果就是aaaa不會輸出50次了。
3 加入執行緒(插隊執行緒)
4 禮讓執行緒和設定優先順序setPriority()
5 同步程式碼塊
同步程式碼塊這裡也需要解釋一下,有的時候回發生一件事情,在一個執行緒中,程式碼還麼有完全執行結束,就被另外一個執行緒搶佔過去,所以就需要使得這個執行緒中的程式碼執行完畢,就加上一把鎖,也就是上圖的程式碼的示意。
6 同步方法
宣告為同步方法,保證是一把鎖,才會使得程序之間不會出錯。鎖物件的概念很重要。
7 執行緒安全問題(火車售票)
package com.haidai.thread; /* * 執行緒安全問題:火車賣票問題 * 100張票,4個視窗賣票 */ public class Demo7 { public static void main(String[] args) { new Ticket().start(); new Ticket().start(); new Ticket().start(); new Ticket().start(); } } class Ticket extends Thread { private static int num = 100; @Override public void run() { while (true) { synchronized (Ticket.class) { if (num <= 0) { break; } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(getName() + "號視窗售:這是第 " + (num--) + " 號票"); } } } }
需要在賣票的程式碼加上·同步鎖,這樣不會出錯。
package com.haidai.thread; public class Demo8 { public static void main(String[] args) { MyTicket mt = new MyTicket(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); } } class MyTicket implements Runnable{ private int num = 100; @Override public void run() { while (true) { synchronized (Ticket.class) { if (num <= 0) { break; } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "號視窗售:這是第 " + (num--) + " 號票"); } } } }
8 死鎖
哲學家只有一隻筷子的故事,2個人拿著對方的資源不釋放,於是死鎖了,為了避免同步程式碼塊死鎖,就不要巢狀同步程式碼塊
9總結
對於同步程式碼塊或者同步方法,他們中的物件必須要是相同的物件才可以是的執行緒安全,好比方說,鎖就是話筒,只有一個話筒,只有一個人拿到了話筒,他才可以說話。