2016-04-05 8 views
0

は、私は次のように機能を持っている:スレッドセーフであるかどうかをチェックするために使用できるメソッドのプロパティは?例えば

public static final Function<A,B> MAP_A_TO_B(){ 
    return new Function<A,B>() { 
     @Override 
     public B apply(A) { 
      switch (A) { 
       case 1: 
        return B1; 
       case 2: 
        return B2; 
      } 
      return B0; 
     } 
    }; 
} 

をしかし、それは方法は、任意のクラス変数への書き込みがないので、私の理解、それが必要として、スレッドセーフであるかどうかはわかりません安全です。私の仮定は正しいのですか?

ありがとうございました。

+0

? – davmac

+5

データを読み取るメソッドは、別のスレッドが書き込むことができるデータを読み取る場合でも、スレッドセーフではありません。結局のところ、メソッドが直接的または間接的にアクセスしているデータを変更する可能性のある他のスレッドが少なくとも1つ存在するかどうかを分析する必要があります。あなたのケースでは、それは 'B1'などが何であるかに依存します。もしそれらが別のスレッド(例えば、誰かが' B1'と 'B2'を入れ替えることができる)に置き換えられれば、スレッドセーフではありません。 – Thomas

+0

@davmac私はMAP_A_TO_Bメソッドを参照しています – Xitrum

答えて

1

davmac already statedのように、MAP_A_TO_B()は、プログラムの状態に関係なく常に新しいFunction<A,B>オブジェクトを返すため、スレッドセーフです。同様に、このFunction<A,B>オブジェクトは常に同じロジックを実行するのでスレッドセーフです。switchステートメントで使用できるタイプはprimitive wrapper types, String and Enumです。最初の2つは不変でスレッドセーフで、最後はスレッドセーフです同じEnumサブタイプの2つの異なるオブジェクトが同等であることができないためです(たとえば、Fruit.APPLEFruit.PEARは、可変状態を持っていても同等の状態になることはありません)。最終フィールドが非最終フィールドname同じ値に設定してください)。それは別段definedでない限り、assume that code is not thread-safeを:

しかし、Bのインスタンスは、私たちはあなたの例ではそれらについての情報を持っていないので、スレッドセーフではないを想定しなければなりません。さらに、型の現在のの実装がスレッドセーフであっても、型自体がそのように定義されていない場合、この実装はスレッドセーフではなく、スレッドセーフであることに依存するブレークコード。

最後に、PEDANTように、それはdefaultケースを使用して、「最後の手段」スイッチケースを定義すると良いでしょう:

public B apply(A) { 
    switch (A) { 
     case 1: 
      return B1; 
     case 2: 
      return B2; 
     default: 
      return B0; 
    } 
} 
1

MAP_A_TO_Bメソッドは、他のスレッドからアクセス可能な状態を読み取り/変更しないため、完全にスレッドセーフです。

あなたのコードは、実際にコンパイルではなく、apply方法の正確な機能は、少しかすんである:

public B apply(A) { 

パラメータは名前を持っている必要があります。

Bが型パラメータの場合、B1が正しい型であることをどのように確認できますか?

これらの問題を解決できた場合、applyメソッドのスレッドセーフティはBxの式になります。これらは他のスレッドからアクセス可能な状態(変数)にアクセスしたり変更したりしますか?

+0

フィールド名に「B1」、「B2」などを使用したいと思うのは、名前 'MAP_A_TO_B'は、(疑似)ジェネリック型の名前が大文字で書かれているだけでなく、 – errantlinguist

+0

@errantlinguistおそらく、フィールド宣言はありません。 – davmac

+0

@errantlinguist私はそうは思わないと思いますか?しかし、ここでの構文上の正確さの欠如は事実です。そして、 'Bx'は実際にフィールドになるかもしれませんが、それでも表現式です。たぶん私はあなたのポイントを見逃しています。 – davmac

2

ではなく、メソッドの財産であること、スレッドの安全性を考える、と思いますこれはデータ項目のプロパティとして使用されます。

スレッドセーフであるためには、データ項目が不変でなければならず、すべての変更が自動的にすべてのスレッドに公開されなければならない(volatileである)か、すべてのアクセス(読み取りと書き込み) (同期化されたオブジェクト)、またはオブジェクトは静的初期化子で設定し、その後は変更しないでください。`MAP_A_TO_B`または` apply` - あなたが参照している方法

Java multi-threading & Safe Publication

関連する問題