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