スレッドセキュリティの問題の原因

1643 ワード

スレッドセキュリティの問題の原因:1,複数のスレッドが共有データを操作している.2,共有データを操作するスレッドコードが複数ある.
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();
        */
    }
}