- 背景
例:チケットを販売するために、ウィンドウ、、Runnableインタフェースの方法を実装するための100票の合計数を作成します
1.問題:チケットを販売するプロセスは、重い投票、間違った投票があった- >セキュリティ問題のスレッドがあった
問題の2.原因:チケットオペレーションのスレッド処理が、完了したときに、操作は他のスレッドに関与していません入って来、またチケットを運営しています。
3.修正方法:スレッド動作時のチケットは、他のスレッドが巻き込まれることができないとき。スレッドは操作が完了するまでチケットの場合は、他のスレッドが操作チケットを開始することができます。これはさえブロックされたスレッド発生し、変更することはできません。
- Javaのソリューション:同期メカニズム
Javaでは、私たちは、アドレスのセキュリティ問題のスレッドに同期メカニズムを可決しました。
//方式一:同步代码块
synchronized(同步监视器){
//需要被同步的代码
}
説明:
- 共有データの1オペレーションコード、同期されるコード。 - >より多くのコードを含めることはできません、と少ないコードを含めることはできません。
-
2.共有データ:変数複数スレッド共同作業。たとえば:チケットは、データの共有です。
-
ロック:3.同期モニタは、通称。クラスの任意のオブジェクトは、ロックとして機能することができます。
要求:多个线程必须要共用同一把锁。
追加:Runnableを複数のスレッドを作成して実装し、我々は同期のモニタとしてこの行為を考えることができますで。
スレッドクラスの継承は、マルチスレッド・モードを作成するには、これは同期モニタとして現在のクラスの作用を考慮すると、注意して使用同期モニターとして働きます。
第二の方法:同期方法
完全な宣言操作するメソッドのコードのデータを共有する場合は、我々としても、この方法では、同期を宣言することがあります。
同期方法の概要について:
- 同期方法は、まだモニターを同期する必要が、我々は明示的に宣言する必要はありません。
- 同期の非静的メソッドは、同期モニタである:この
同期の静的メソッドは、同期モニタである:現在のクラス自体
三つの方法:ロックロック - JDK5.0新しいです
- 質問インタビュー:類似点と相違点の同期とロック?
- 同じ:両方ともスレッド安全性の問題を解決することができます
- 異なる:同期メカニズムは、対応する同期コードの後に行われ、同期モニタは自動的に解除します
- インプリメンテーションの終了を同期手動に必要と同時に、)手動で同期(ロック(起動する必要がロック(ロック解除())
優先順位の使用:
ロック- >シンクブロックは、(対応するリソースを割り当てる方法の身体に入っている) - >同期方法(体外法)
-
長所と短所
セキュリティスレッドの問題を解決するための同期方法。-利点
オペレーション同期コードは、一つのスレッドだけに参加することができ、他のスレッドが待機します。シングルスレッドのプロセスの同等物は非効率的です。 -
質問インタビュー:Javaは、スレッドの安全性の問題を解決する方法である、いくつかの方法がありますか?とのさまざまな方法を比較
この問題を解決するための同期やロック、スレッドセーフな方法をコントラスト:顔の質問
スレッドセーフシングルトン -怠惰な人間
怠惰なスレッドセーフで書き換え実施の形態では、単一の同期メカニズムを使用して。
class Bank{
private Bank(){}
private static Bank instance = null;
public static Bank getInstance(){
//方式一:效率稍差
// synchronized (Bank.class) {
// if(instance == null){
//
// instance = new Bank();
// }
// return instance;
// }
//方式二:效率更高
if(instance == null){
synchronized (Bank.class) {
if(instance == null){
instance = new Bank();
}
}
}
return instance;
}
}
インタビューの質問:スレッドセーフなシングルトンを書きます。
空腹の男のスタイル。
レイジー式:の上方に設けられました。
デッドロック
1. デッドロックは理解:
異なるスレッドは、他のリソースによって占有されている他は、彼らが、スレッドのデッドロックを形成するために必要な同期化リソースを与えるために待っている、あきらめないで同期するために必要な
2. 説明:
- 1デッドロックした後、異常が表示されない、プロンプトが表示されませんが、スレッドがブロックされた状態であり続けることはできません
- 2当社は回避デッドロックに同期を使用します。
3. 例えば:
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
new Thread(){
@Override
public void run() {
synchronized (s1){
s1.append("a");
s2.append("1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s2){
s1.append("b");
s2.append("2");
System.out.println(s1);
System.out.println(s2);
}
}
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (s2){
s1.append("c");
s2.append("3");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1){
s1.append("d");
s2.append("4");
System.out.println(s1);
System.out.println(s2);
}
}
}
}).start();
}