JAvaスレッドのセキュリティ問題の解決方法

14232 ワード

JAvaスレッドのセキュリティ問題の解決方法
  • Runnableインタフェース種を書き換えるrunメソッド
  • package cn.tread;
    
    public class runnable implements Runnable {
        private int ticket =100;
        @Override
        public void run() {
            while (true){
                if (ticket>0){
                    System.out.println(Thread.currentThread().getName()+"   "+ticket+"  ");
                    ticket--;
                }
            }
        }
    
  • さっき書いたインスタンスオブジェクトを作成してNew 1つのThreadオブジェクトを呼び出しましょうさっきのインスタンスオブジェクトを入れstartメソッドで
  • を実行します.
    package cn.tread;
    
    public class demo {
        public static void main(String[] args) {
            runnable demo1=  new runnable();
    //        Thread      //        Thread              runnable     
            Thread to1 = new Thread(demo1);
            Thread to2 = new Thread(demo1);
            Thread to3 = new Thread(demo1);
            to1.start();
            to2.start();
            to3.start();
    
        }
    }
    
    

    安全上の問題の原因
    このケースでは、3つのスレッドを開き、3つのスレッドが実行権を奪い、if文を実行するとcpu実行権が失われ、速度が速すぎて最初のスレッドを実行すると同時に印刷されます.
    解決策
  • 同期コードブロック
  • package cn.  ;
    
    public class runnable implements Runnable {
        private int ticket =100;
        Object obj = new Object();
        @Override
        public void run() {
            while (true){
    			//      synchronized 
                //        Synchronized Java                    ,                
              synchronized (obj){
                  if (ticket>0){
                      try {
                          Thread.sleep(10);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      System.out.println(Thread.currentThread().getName()+"   "+ticket+"  ");
                      ticket--;
                  }else {
                        break;
                  }
              }
            }
        }
    
  • 同期メソッド定義フォーマット修飾子synchronized戻り値タイプメソッド名(パラメータリスト){共有データのコード/問題のあるコードに重複データが発生する可能性がある}
  • package cn.  ;
    
    public class runnable implements Runnable {
        private int ticket =100;
        Object obj = new Object();
        @Override
        public void run() {
            while (true){
    //             
                //        
                payket();
            }
        }
        public synchronized void payket(){
                if (ticket>0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"   "+ticket+"  ");
                    ticket--;
                }
        }
    
  • ロック機構
  • public class ReentrantLock implements Lock, java.io.Serializable
  • ロックを使用する場合ロックサブクラスrenntrantlock
  • を呼び出す必要がある
  • Lockはより先進的であり、lockでロックunlock解放ロック
  • を取得することができる.