スレッド同期&スレッドプールの
スレッド同期
どのスレッド同期の問題は存在しません。
- 複数のスレッドが同じリソースを操作する場合は、問題があるでしょうし、リソースの一般的な使用を実現するために、スレッドの同期が必要になります。この問題を回避するために、操作や運用リソースが存在しません繰り返します。
スレッド同期:
- 複数のスレッドが同じリソースを操作する場合は、ロックを取得するためのスレッドがある場合には、スレッドが取得するためのロックを解除するまで、オペレーションコードに加えてロックのリソースは、他のスレッドはロックされたソースコードを操作することはできませんロック。
スレッドの同期を達成するための3つの方法:
シンクブロック
synchornized(OBJ){
同じリソースの操作に関する//コード
}
注:静的シンクブロック
OBJ:オブジェクトの任意のタイプは、ロックに対応し、同じリソースの動作は、同じスレッドのロックを使用しなければなりません。
同じロックを使用して、複数のスレッドを確保するには?
sychornizedコードブロック内の変数の宣言上のオブジェクトの位置にスレッドオブジェクトメンバ変数宣言を定義するスレッドタスク設定に
/ **
アナログ機能チケットを、オープン複数のスレッドが同時に百枚のチケットを購入します
/
クラスSaleTicket実装Runnableを{パブリック
/
同一の変数と異なるオブジェクト
/
プライベート静的INTチケット= 100。/** *不同线程使用同一个锁对象 */ private Object obj = new Object(); @Override public void run() { while(true) { /** * 使用synchornized(obj) {} 代码块 */ synchronized (obj) { if (ticket > 0) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "sale=====" + ticket); ticket--; } } } } } public class SaleTicketDemoTest { public static void main(String[] args) { SaleTicket sale = new SaleTicket(); //开启3个线程操作同一对象,从而操作同一资源 Thread th1 = new Thread(sale); Thread th2 = new Thread(sale); Thread th3 = new Thread(sale); th1.start(); th2.start(); th3.start(); } }
同期方法の
パブリックsynchorniedボイドメソッド名(){
同じリソース含む方法//操作
}
ロック同期プロセス:
ロック同期方法は、この目的で使用され、即ち、新しいスレッド(XXX)はXXXはオブジェクトである
パッケージcom.test.javaと、/** *模拟买票功能,开启多个线程,同时买一百张票 */ public class SaleTicket implements Runnable{ /* 不同对象使用同一个变量 */ private static int ticket=100 ; /** *不同线程使用同一个锁对象 */ private Object obj = new Object(); @Override public void run() { while(true) { saleTicket(); } } /** * 定义个个同步方法 public snychonized void XXX(){} */ public synchronized void saleTicket() { if (ticket > 0) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "sale=====" + ticket); ticket--; } } }
静的同期方法
パブリック静的sychornized XXX(){
//共有リソースの操作に関するコード
}
静的ロック同期プロセスであるオブジェクト・クラス名の.classその
パッケージcom.test.java。/** *模拟买票功能,开启多个线程,同时买一百张票 */ public class SaleTicket implements Runnable{ /* 不同对象使用同一个变量 */ private static int ticket=100 ; /** *不同线程使用同一个锁对象 */ private Object obj = new Object(); @Override public void run() { while(true) { saleTicket(); } /** * 静态同步方法 */ public static synchronized void saleTicket() { if (ticket > 0) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "sale=====" + ticket); ticket--; } } }
ロックメカニズム
ロックの利点:ロックが他のスレッドが無期限に待機し、リリースされていないときに問題を解決するための共有リソース。
java.util.concurrent.locksでJDK1.5後
複数のスレッドが読み取り専用されている場合、スレッドは、読み出し動作を行っているとき、そう、他のスレッドは読み取り専用ことができない待つことができます。そこで我々は、複数のスレッドを使用可能にするメカニズムを必要とするあなたがロックして行うことができ、スレッド間の競合ではなく、読み取り専用のある
差のロックとのsynchornized:- ロックは、Java言語組み込みの、synchronizedキーワードJava言語ではないため、内蔵された機能を備えています。ロックは、このクラスを介してアクセスを同期させることができるクラスです。
- そしてロックを手動でユーザーである必要があり、メソッドを同期またはコード実行のブロックを同期するとき、システムは自動的にスレッドが占有のロックを解除するだろう、手動でロックを解除するためにユーザを必要とせずに同期して、それは、非常に異なっているロックと同期ロックを解除するためのイニシアチブを取るされていない場合、ロックを解除し、それがデッドロックにつながる可能性があります。
- ロックを使用して、我々はロックを解除するためのイニシアチブをとる必要があり、例外が発生したときに、自動的にロックを解放しません。そのため、デッドロックを防ぐために、一般的に、我々はロック}キャッチ{}のtry {内のブロックを使用しなければならない、とロック解除操作は、最終的にはロックが解除されていなければならないことを保証するために、ブロック内で行われます。一般的な単語を同期するために使用されるロック
- ロックは、Java言語組み込みの、synchronizedキーワードJava言語ではないため、内蔵された機能を備えています。ロックは、このクラスを介してアクセスを同期させることができるクラスです。
スレッドプール