マルチスレッドとスレッドの同期とデッドロック中間の進化05
マルチスレッドの問題:複数のスレッドが同じオブジェクトにアクセスし、一部のスレッドがこのスレッドを変更したい
スレッド同期は一種の待機メカニズムであり、このオブジェクトに同時にアクセスする複数のスレッドがこのオブジェクトの待機プールキューに入ります
同時
同じオブジェクトが複数のスレッドによって同時に操作されている
キューとロック
スレッド同期
同じプロセスの複数のスレッドが同じストレージスペースを共有するため、アクセス時にデータの正確性を確保するために、アクセス時に同期化されたロックメカニズムが追加されます。スレッドがオブジェクトの排他ロックを取得すると、リソースを独占し、他のスレッドは待機する必要があります、使用後にロックを解除しますが、問題があります
- ロックを保持しているスレッドは、このロックを必要とする他のすべてのスレッドをハングさせます。
- マルチスレッドの競合状況では、ロックのロックと解放により、コンテキストの切り替えとスケジューリングの遅延が増加し、パフォーマンスの問題が発生します
- 優先度の高いスレッドが優先度の低いスレッドがロックを解放するのを待つと、優先度が逆転し、パフォーマンスの問題が発生します。
package com.example.thread;
public class UnsafeBuyTickets {
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
new Thread(buyTicket, "A").start();
new Thread(buyTicket, "B").start();
new Thread(buyTicket, "C").start();
}
}
class BuyTicket implements Runnable {
private int ticketNum = 10;
boolean flag = true;
@Override
public void run() {
while (flag) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void buy() throws InterruptedException {
if (ticketNum <= 0) {
flag=false;
return;
}
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"get"+ticketNum--);
}
}
同期方法
privateキーワードは、データオブジェクトがメソッドによってのみアクセスできることを保証します。メソッドで提案されているメカニズムは、同期キーワードです。同期メソッドと同期コードブロックの2つの使用方法があります。
同期メソッド:public sychronized void method(int args){}
同期メソッドは「オブジェクト」へのアクセスを制御します。各オブジェクトはロックに対応します。各同期メソッドは、メソッドを実行する前に、メソッドを呼び出すオブジェクトのロックを取得する必要があります。それ以外の場合、スレッドはブロックされます。メソッドが実行されると、ロックは排他的に使用されます。メソッドが戻ってロックを解放すると、ブロックされたスレッドはロックを取得して実行を継続できます
欠陥、大きなメソッドが同期されていると宣言されている場合、効率に影響します
メソッドで変更する必要があるコンテンツをロックする必要があります
同期ブロック
同期ブロック:同期(OBJ){}
Objは同期モニターと呼んでいます
Objは任意のオブジェクトにすることができますが、共有リソースを同期モニターとして使用することをお勧めします
同期メソッドでは、同期メソッドの同期モニターがオブジェクトまたはクラスであるため、同期モニターが順不同で指定されています。
同期モニターの実行プロセス:
- 最初のスレッドがアクセスし、同期モニターをロックして、コードを実行します
- 2番目のスレッドがアクセスし、同期モニターがロックされていてアクセスできないことがわかりました
- 最初のスレッドアクセスが完了し、同期モニターのロックを解除します
- 2番目のスレッドがアクセスし、同期モニターがロックされていないことを検出し、ロックしてアクセスします。
デッドロック
複数のスレッドがそれぞれいくつかの共有リソースを占有し、他のスレッドが占有するリソースが実行されるのを待ちます。その結果、2つ以上のスレッドがお互いにリソースを解放し、すべてが実行を停止するのを待っています。特定の同期ブロックには「2つ以上のオブジェクトがロックされると、デッドロックの問題が発生する可能性があります
デッドロックに必要な4つの条件
- 相互に排他的な条件:1つのリソースは一度に1つのプロセスでのみ使用できます
- リクエストとホールドの条件:プロセスがリソースのリクエストによってブロックされた場合、取得したリソースを保持します
- 非剥奪の条件:プロセスによってすでに取得されたリソースは義務に使用されていないため、強制的に剥奪することはできません
- 循環待機状態:いくつかのプロセス間で一種の循環待機リソース関係が形成されます。
回避:4つの必要条件の1つを破壊する