java中執行緒安全問題如何解決?
阿新 • • 發佈:2019-01-08
執行緒安全問題解決方法:
在程式碼中使用同步程式碼塊(同步鎖)
解釋:在某一段任務中,同一時間只允許一個執行緒執行任務,其他的執行緒即使搶到了cpu,也無法進入當前的任務區間,只有當
當前的執行緒將任務執行完後,其他的執行緒才有資格進入.
同步程式碼塊的構成:
synchronized(鎖(物件)){
同步的程式碼
}
作為鎖物件的要求:
1.必須是物件
2.必須保證被多執行緒共享
可以充當鎖的:
1.一個普通的物件
2.當前物件的引用--this
3.類的位元組碼檔案
同步程式碼塊的特點:
1.可以保證執行緒的安全
2.由於每次都要進行判斷處理,所以降低了執行效率
總結:什麼時候可以使用同步程式碼塊?
答:1.多執行緒共享一個數據
2.至少有兩個執行緒
public class Demo { public static void main(String[] args) { // 1.先建立一個任務類物件 Ticket1 ticket = new Ticket1(); // 2.建立執行緒並繫結任務 /* * 如果我們自己建立了獨立的任務類,執行緒會優先呼叫我們手動傳入的任務類的run方法,不會再去呼叫Thread類預設的run方法 */ Thread thread1 = new Thread(ticket); Thread thread2 = new Thread(ticket); Thread thread3 = new Thread(ticket); Thread thread4 = new Thread(ticket); // 開啟執行緒 thread1.start(); thread2.start(); thread3.start(); thread4.start(); } } // 建立任務類 class Ticket1 implements Runnable { // 因為Ticket物件被4個執行緒共享,所以num也被共享 int num = 20; boolean end = false; // 充當鎖--這裡的內容是被共享的 // 條件:1.必須是物件 2.必須被多個執行緒共享 Object object = new Object(); public void run() { while (!end) { synchronized (object) {// 同步程式碼塊--相當於讓執行緒之間形成互斥的關係 // 製造一個延遲,相當於讓當前的執行緒休息一會(臨時讓出cpu) try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } if (num > 0) { System.out.println(Thread.currentThread().getName() + " " + --num); } else { end = true; } } } } }