2

ThreadアプリケーションでJavaを拡張するスレッドMyTで定義されたいくつかの可変変数を使用したいのですが、その使用法はその中のThread.currentThread.asInstanceof[MyT]可変変数を参照および更新することです。

これはスレッドセーフになりますか?

アップデート

マルチスレッドの問題を考慮せずに、オブジェクトで可変変数を使用するといういわゆるワースト プラクティスを使用して、scala を使用していくつかのアプリケーションを作成しました (初心者にとって非常に使いやすいためです!)。

しかし、どういうわけか、プロジェクトは Web アプリケーションに拡張され、マルチスレッドの問題に対処する必要があります。

オブジェクト内のすべての可変変数を引数としてリファクタリングするためにコードを再度書き直す時間がないので (おそらく、グローバル オブジェクトの可変変数を使用しないという 1 つの解決策)、オブジェクト内の可変変数を拡張するスレッド クラスに移動することを考えています。Threadクラスを作成し、使用するコードをリファクタリングしてThread.currentThreadから、インスタンスを拡張スレッド タイプにキャストし、元はグローバルな可変変数である可変変数を参照/更新します。

だからここに私の最初の質問があります。

4

3 に答える 3

5

この目的には ThreadLocal を使用してください: http://java.dzone.com/articles/java-thread-local-%E2%80%93-how-use

于 2013-04-10T05:08:17.787 に答える
2

スレッド自体内から可変変数のみを操作する場合(Thread.currentThread.asInstanceof[MyT]前述のユース ケース)、それはスレッド セーフです (通常は ThreadLocal よりも高速です)。

のスレッドから変数を操作する場合、スレッド セーフではない可能性があります。

もちろん、まだあまり Scala っぽいというわけではありません。可能な限り可変状態を避けるようにしてください。リファクタリングが難しいと思われるコードがある場合は、Stack Overflow の優秀なスタッフがいつでも喜んでお手伝いします。

于 2013-04-10T10:46:55.043 に答える