***


(マルチスレッド操作同じリソース)の同時問題
  • スレッド同期ロックメカニズムによる質問
  • 1.1つのスレッドがロックを保持すると、他のすべての必要なスレッドが
  • に停止します.
  • 2.マルチスレッド競合では、ロックの追加と解除により、コンテキストの切り替えとスケジューリングの遅延が多くなり、パフォーマンスの問題が発生します.
  • 3.優先度の高いスレッドが優先度の低いスレッドのロック解除を待つと、優先度が逆転し、パフォーマンスの問題が発生します.パフォーマンスの逆転


  • *synchronizedキーワードの2つの使い方:synchronizedメソッドとsynchronizedブロック
  • 同期方法:synchronized方法
  • 各オブジェクトにはロックがあり、synchronizedメソッドごとにそのメソッドを呼び出すオブジェクトのロックを取得する必要があります.そうしないと、スレッドは
  • をブロックします.
  • メソッドは、いったん実行すると、ロックを独占し、そのメソッドが戻ることを知ってからロックを解放し、その後ブロックスレッドがこのロックを取得することができ、
  • を実行し続ける.
  • public synchronized void method(){}

  • 同期コードブロック:synchronized(obj){}
  • obj同期モニタ、
  • は任意のオブジェクトとすることができるが、共有リソースを同期モニタとして使用することを推奨し、一般的には、そのオブジェクトを操作して削除し、オブジェクトを持って同期モニタ
  • を行う.
  • 同期メソッドでは同期モニタを指定する必要はありません.同期メソッドの同期モニタのデフォルトはthis、すなわちこのオブジェクト自体、またはclass
  • です.
    //    
    public class UnsafeTicket{
        public static void main(String[] args) {
            BuyTicket buyTicket=new BuyTicket();
    
            new  Thread(buyTicket,"  qi").start();
            new  Thread(buyTicket,"Eden").start();
            new  Thread(buyTicket,"  ai").start();
    
        }
    }
     class BuyTicket implements Runnable{
        private  int ticketNums=10;
        private  boolean flag=true;
    
        @Override
        public void run() {
            while (flag){
                try {
                    buy();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private synchronized void buy() throws InterruptedException {
            if(ticketNums<=0){
                flag=false;
                return;
            }
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName()+"   "+ticketNums--+" ");
        }
    }
    
    //     
    
    public class UnSafeBank {
        public static void main(String[] args) {
            Account account = new Account(1000, "     ");
    
            Drawing you = new Drawing(account, 50, "   ");
            Drawing girlFriend = new Drawing(account, 100, "girlFriend");
    
            you.start();
            girlFriend.start();
        }
    }
    
    
    class Account {
        int money;
        String name;
    
        public Account(int money, String name) {
            this.money = money;
            this.name = name;
        }
    }
    
    
    class Drawing extends Thread {
        Account account;
        int drawingMoney;
        int nowMoney;
    
        public Drawing(Account account, int drawingMoney, String name) {
            super(name);
            this.account = account;
            this.drawingMoney = drawingMoney;
        }
    
        @Override
        public void run() {
            synchronized (account) {
                if (account.money - drawingMoney < 0) {
                    System.out.println(Thread.currentThread().getName() + "    ");
                    return;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                account.money = account.money - drawingMoney;
                nowMoney = nowMoney + drawingMoney;
    
                System.out.println(account.name + "   :" + account.money);
                System.out.println(this.getName() + "   :" + nowMoney);
            }
        }
    }
    
    
  • デッドロック:複数のスレッドが相手の必要なリソースを保有し、その後、膠着状態になる
  • 複数のスレッドは、共有するリソースを様々に占有する、他のスレッドが占有するリソースを互いに待機してこそ実行することができ、2つ以上のスレッドは、相手がリソースを解放するのを待機し、実行を停止する場合がある.
  • 同期コードブロックの同僚が「2つ以上のオブジェクト」のロックを持っていると、デッドロックの問題が発生する可能性があります.
  • デッドロックを生成する4つの必要条件:
  • 1.反発条件1つのリソースは、1つのスレッドごとに
  • しか使用できません.
  • 2.要求と保持条件:1つのスレッドが要求リソースによってブロックされた場合、取得したリソースに対して
  • を保持しない.
  • 3.条件を剥奪しない:スレッドがすでに獲得したリソースは、使用が完了するまで
  • を強制的に剥奪することはできない.
  • 4.ループ待機条件:複数のスレッド間に1つのヘッダとテールが接続するループ待機リソース関係
  • が形成される.


  • lockロックは、定義された同期ロックjdk 5が
  • を開始することを示す.
  • Lockインタフェース
  • ReentrantLockクラスはLockインタフェースを実現し、ロック
  • に再入可能である.
  • はsynchronizedと同じ同時性とメモリの意味を持ち、ロックを表示したり、ロックを解放したりすることができるため、一般的に使用されています.


  • synchronizedとlockの対比
  • 1.ロックロックロックは表示ロックで、手動でロックして解放する必要があります.synchronizedは暗黙的なロックであり、役割ドメインを除いて
  • を自動的に解放する.
  • 2.Locはコードブロックロックのみ;synchronizedコードブロックロックとメソッドロック
  • 3.ロックロックを使用すると、JVMは小さな都市をスケジューリングするのに時間がかかり、パフォーマンスが向上し、拡張性が向上します.