5

スレッドセーフであることを確認するためにJavaコードを読んでいます。

私が理解しているように、メソッド内のローカル変数はスタックメモリアドレスに属しているため、スレッドセーフです。クラス/インスタンス変数は、他のスレッドによって共有されるヒープ メモリに属しているため、スレッド セーフではありません。

経験則により、クラス変数に触れるすべてのメソッドに synchronized キーワードを置くことができます。

マルチスレッドの問題を分析/防止できるEclipseプラグインまたはルールはありますか?

4

6 に答える 6

2

スレッドの安全性を決定的にチェックするものはないと思います。明らかな間違いを見つける合理的な仕事をするfindbugsのような、すでに言及されているいくつかのツールがあります。

プログラムが変数や参照を異なるスレッドにリークしていないこと、および複数のスレッドで使用されているものを各スレッドが「正しい」値を確認できるようにすることは、プログラマの責任です。

パフォーマンスよりも安全性を考慮して設計すると、ニーズに合わせて適切に機能することがわかるかもしれませんが、最適化を行うと、複雑さが増し、失敗する可能性があり、ボトルネックにならない可能性があります。

特にJava Concurrency In Practiceを読むことをお勧めします。Effective Javaも役立つ場合があります。

于 2013-03-31T16:13:00.563 に答える
0

コメントの詳細ですが、少し長すぎます。

経験則により、クラス変数に触れるすべてのメソッドに synchronized キーワードを置くことができます。

そうではありません - Vector クラスの例を考えてみてください。同期されますが、反復には外部ロックが必要です。同時実行の代替手段は、たとえば CopyOnWriteArrayList です。これにより、コレクション全体をロックする必要なく反復が可能になります。

synchronized結論として、他の人がすでに回答しています。どこにでも追加するほど簡単ではありません。クラスのコントラクトを正確に分析し、マルチスレッドの状況でもコントラクトが満たされていることを確認する必要があります。

于 2013-03-31T17:58:15.700 に答える
0

ThreadSafe ( http://www.contemplateltd.com/threadsafe、無料試用版あり) は、質問が求めていることを正確に実行します。Apache JMeter や K9Mail などのオープン ソース アプリケーションで見つかった同時実行エラーの例については、このInfoQ の記事を参照してください。ユーザーの意見については、Ivan Senic のブログを参照してください。ThreadSafe のウィキペディアのエントリに簡単な要約があります。

(開示: ThreadSafe は商用ツールであり、私はそれを作成する会社である Contemplate の共同設立者です。)

于 2014-06-21T06:26:05.060 に答える