私は現在Javaを学んでおり、同期のトピックに到達しました。
いくつかの理由で、以下のコード(The Complete Reference JAVA-Herbert Schildt 7th Edition、Pgno。239-240のコードに基づく)では、必要な出力が得られません。
コード:
package package1;
class Call{
synchronized public void call(String msg){
System.out.print("[" + msg);
try{
Thread.sleep(100);
}catch (InterruptedException e){
System.out.println("Interrupted Exception Caught");
}
System.out.println("]");
}
}
class CallMe implements Runnable{
String msg;
Call target;
Thread t;
public CallMe(Call targ, String message){
target = targ;
msg = message;
t = new Thread(this);
t.start();
}
public void run(){
target.call(msg);
}
}
public class Synchronization {
public static void main(String[] args) {
Call target = new Call();
CallMe obj1 = new CallMe(target, "Hello");
CallMe obj2 = new CallMe(target, "Synchronized");
CallMe obj3 = new CallMe(target, "World");
try{
obj1.t.join();
obj2.t.join();
obj3.t.join();
}catch (InterruptedException e){
System.out.println("Interrupted Exception Caught");
}
}
}
必要な出力:
[Hello]
[Synchronized]
[World]
実際の出力(2013年後半にMacbook ProでEclipseを使用しています):
[Hello]
[World]
[Synchronized]
これらのトピックの出力はすべてコンピューターごとに異なることを読みました。
なぜこれが機能しないのか誰かに説明してもらえますか?
異なるCallMe
インスタンスが並行して呼び出され、それらが処理される順序が保証されていないためです。あなたが知っている唯一のことは、Call.call(String)
このメソッドがであるため、それは並行して呼び出されないということですsynchronized
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加