次のコードを可能な限り同時に動かすことができないため、Javaで非常に失望しています。同期がない場合、2つのスレッドはより頻繁に切り替えられますが、同期メソッドにアクセスしようとすると、2番目のスレッドがロックを取得するまでに(30秒のように)時間がかかりすぎ、最初のスレッドがロックを取得する前に2番目からJavaのスレッド/同期
public synchronized static void i()
{
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] f)
{
Thread t = new Thread(new Runnable(){
public void run()
{
while(true)
i();
}});
t.setName("a: ");
Thread t2 = new Thread(new Runnable(){
public void run()
{
while(true)
i();
}});
t2.setName("b: ");
t.start();
t2.start();
}
exabrialとChikeiの答えを組み合わせると、正解が正解になります。 exebrialが指摘した理由のため、公平性はデフォルトで保証されません。しかし、インタリーブに関しては、私はChikeiの提案にいくらか公平な保証をするロックを使うことになるでしょう。 '完全な'インターリーブが必要な場合、つまりスレッドBは常にスレッドAの後に実行され、スレッドAが再び実行される前に、別のロック方式が必要です。 – brettw
ありがとう、どちらの方法もうまくいくようです –