スレッドセキュリティの問題の原因
1643 ワード
スレッドセキュリティの問題の原因:1,複数のスレッドが共有データを操作している.2,共有データを操作するスレッドコードが複数ある.
1つのスレッドが共有データの複数のコードを操作する過程で、他のスレッドが演算に関与する.スレッドセキュリティの問題が発生します.
解决の考え方:複数の操作がデータを共有するスレッドコードをカプセル化して、スレッドがこれらのコードを実行している时、他のスレッドは演算に参加できないので、今のスレッドがこれらのコードを実行した后に、他のスレッドは演算に参加することができます
Javaでは、同期コードブロックでこの問題を解決できます.
同期コードブロックのフォーマット:synchronized(オブジェクト){同期が必要なコード:}
同期の利点:スレッドのセキュリティ問題を解決します.
同期の弊害:同期外のスレッドが同期ロックを判断するため、比較的効率が低下します.
同期の前提:同期に複数のスレッドがあり、同じロックを使用する必要があります.
1つのスレッドが共有データの複数のコードを操作する過程で、他のスレッドが演算に関与する.スレッドセキュリティの問題が発生します.
解决の考え方:複数の操作がデータを共有するスレッドコードをカプセル化して、スレッドがこれらのコードを実行している时、他のスレッドは演算に参加できないので、今のスレッドがこれらのコードを実行した后に、他のスレッドは演算に参加することができます
Javaでは、同期コードブロックでこの問題を解決できます.
同期コードブロックのフォーマット:synchronized(オブジェクト){同期が必要なコード:}
同期の利点:スレッドのセキュリティ問題を解決します.
同期の弊害:同期外のスレッドが同期ロックを判断するため、比較的効率が低下します.
同期の前提:同期に複数のスレッドがあり、同じロックを使用する必要があります.
class Ticket implements Runnable{ //extends Thread{
private int num = 100;
Object obj = new Object();
public void run(){
while (true){
synchronized(obj){
if (num>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}
}
}
}
public class SaleTicket {
public static void main(String[] args) {
Ticket t = new Ticket();// 。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
/*
Ticket t1 = new Ticket();
// Ticket t2 = new Ticket();
// Ticket t3 = new Ticket();
// Ticket t4 = new Ticket();
t1.start();
t1.start();
t1.start();
t1.start();
*/
}
}