;睡眠()メソッドは、ロックが、解除のCPUを解放しない
ロックリソースで動作する複数のスレッドがある場合は、スレッドがロックを所有している場合、しかし、睡眠()メソッドの実装のメソッドの実装インチ 唯一のスレッドで他のスレッドがウェイクアップしてロックを解除した後に、メソッドを実行し、スレッドが再び競争するためにリソースをロックすることができます。
チケット例:
クラスMyThread2実装Runnableを{
private int TICKET = 5;
@Override
public void run() {
while (true) {
synchronized (this) {
if (this.TICKET > 0) {
//得到当前线程名字
System.out.print(Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( "卖票:票数剩余:" + (--TICKET));
} else {
System.out.println("票已经卖完");
break;
}
}
}
}
}
結果:
導体Aのチケット:残りの投票:4
導体Aのチケット:投票残り:3
導体チケットC:残りの投票:2
導体Cのチケット:残りの投票:
導体Cのチケット:残りの投票:0
票外にそれが販売された
チケットが完売されてい
完売されているチケットを
、ロックをスレッド際に所持した後、導体は、それが100ミリ秒を寝ていても、投票(投票> 0)の手を発見し、それが常に成功チケットが販売されています。その代わりに、睡眠中は、チケットは販売していない、別のスレッドロックによって奪わ。唯一のうち、if文を実行した後に同期(){}メソッド本体の後、再び奪うために、他のリソースとのリソースをロックします。
ここで説明する理由使用する各スレッドThread.start()がrun()メソッド回実行されるので(TRUE){}構造は、包まれています。出たら、彼が出てくることができなかった、その結果は、各スレッドが唯一のチケットを売ることができるということです。
睡眠()メソッドは、だけではなく、CPUのタイムスライスの、ロックを保持し、カップのリソースを解放します。他のスレッドはロックの所有に加えて、他のリソースを実行することができます。