以下のコードスニペットでは、doThings()メソッドを静的として宣言すると、クラスがスレッドセーフになります。この理由は、複数のTestSevenスレッドが開始され、xが競合状態が発生する可能性のある静的変数であるためですか?このコードはスレッドセーフではないのはなぜですか?
public class TestSeven extends Thread{
private static int x;
public synchronized void doThings(){
int current = x;
current++;
x = current;
}
public void run(){
doThings();
}
public static void main(String args[]){
TestSeven t = new TestSeven();
Thread thread = new Thread(t);
thread.start();
}
}
Btwは、スレッドであるTestSevenをThreadコンストラクタの引数として渡します。これはThread IS-A Runnableのために機能しますが、推奨されていません。TestSevenがRunnableを実装するようにしてください。 –