JAvaでのスレッドセキュリティの問題はどのように解決しますか?

1588 ワード

スレッドセキュリティの問題解決方法:
コードでの同期コードブロックの使用(同期ロック)
解釈:あるタスクでは、同じ時間に1つのスレッドだけがタスクを実行できます.他のスレッドはcpuを奪っても、現在のタスク区間に入ることはできません.
現在のスレッドがタスクを実行すると、他のスレッドが入る資格があります.
同期コードブロックの構成:
synchronized(ロック(オブジェクト){
同期コード
}
ロック対象としての要件:
1.オブジェクトでなければなりません
2.マルチスレッド共有を保証する必要がある
ロックとして使用できるもの:
1.一般的なオブジェクト
2.現在のオブジェクトの参照--this
3.クラスのバイトコードファイル
同期コードブロックの特徴:
1.スレッドの安全を保証できる
2.判断処理が毎回行われるため、実行効率が低下する
まとめ:同期コードブロックはいつ使用できますか?
答え:1.マルチスレッド共有データ
2.少なくとも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;
				}
			}

		}
	}
}