1. 程式人生 > >java中執行緒安全問題如何解決?

java中執行緒安全問題如何解決?

執行緒安全問題解決方法:

在程式碼中使用同步程式碼塊(同步鎖)

解釋:在某一段任務中,同一時間只允許一個執行緒執行任務,其他的執行緒即使搶到了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;
				}
			}

		}
	}
}