-1

私はこのコードを持っています:

public class Tarea implements Runnable
{

    private int valor;


    public Tarea()
    {
         valor = 0;
    }


    public void run()
    {
         for (int i = 1; i <= 10; i++)
         {
             valor++;
         }
         System.out.println(Thread.currentThread().getName() + " Valor " + valor);
    }
}

public class AppTarea
{

    public static void main(String[] args)
    {
         Thread[] hilos = new Thread[5];
         for (int i = 0; i < hilos.length; i++)
         {
             hilos[i] = new Thread(new Tarea());
             hilos[i].start();
         }
         System.out.println("Main terminado");
    }
}

このスレッドは安全ですか。変数 valor を揮発性として定義する必要がありますか。勇気は異なるスレッドで共有されていますか? ありがとう。

4

6 に答える 6

1

何も共有されていないため、スレッドセーフです....変数valorは各スレッドに固有です...

于 2012-05-25T07:14:54.423 に答える
0

変数はインスタンス変数であり、スレッドとインスタンスの間に 1 対 1 のマッピングがあります。したがって、各スレッドには状態の個別のコピーがあります。したがって、同期は必要ありません。

変数がスレッド間で共有されている場合は、同期する必要があります。

于 2012-05-25T07:16:28.857 に答える
0

run()これは、同じクラスからのコンストラクターとメソッドへのアクセスのみであるため、スレッドセーフです。変数を使用できる唯一のスレッドは実行中のスレッドであり、Java メモリ モデル(および実際には私が認識しているすべてのメモリ モデル) の下でそれ自体と同期されるため、ここにデータ競合はありません。ここにはキーワードvolatileも必要ありません。synchronized

volatile キーワードは、複数のスレッドから変数を変更したい場合に使用され、そのためにキャッシュに保存したくない場合に使用されます。これは当てはまりません。変数はここで単一のスレッドによって変更されます。

于 2012-05-25T07:15:00.883 に答える
0

簡単な答え: はい、これはスレッド セーフです。

長い答え: スレッドのメンバー変数は共有リソースではないため、コードはスレッド セーフです。これは、作成するすべてのスレッドがvalorメンバー変数を所有することを意味します。volatile共有リソースに使用して、それらが同期され、スレッド間でキャッシュされないようにする必要があります。

于 2012-05-25T07:24:12.553 に答える
0

答えはいです。すべてのスレッドは独自のコンテキストで実行され、変数「valor」を使用しています。

于 2012-05-25T07:31:53.637 に答える
-1

いいえ、共有されません。プライベートインスタンス変数です。クラスのすべてのインスタンスにはプライベート コピーがあり、クラスの外部にアクセスする方法がないため、安全です。

--以下の議論によると、私の最初の答えは間違っていました - 重要なインスタンスと静的可変角度を見逃していました。以下は元の答えです:

いいえ、共有されていません。プライベート変数です。クラスの外からアクセスする方法はないので安全です。

于 2012-05-25T07:13:38.570 に答える