ThreadLocalの、静的変数、インスタンス変数、ローカル変数は、スレッドセーフです、回答:ByteBufferの最後に使用する方法?少し概要をプログラミングネットワーク!
ビジネス開発のすべてのレベル、今ネットワークプログラミング会社の前に、一度にあまりにも多くの物事が根底にあるJavaアプリケーションを理解し、アプリケーションを勉強しながら、私は今の私。限られた知的能力のためには、そこのブログへの最後のポストにある小さな失態であり、これは、ボーの慎重友だちた欠陥があります。
非常に多くの提案や批判を追っありがとう、ご清聴ありがとうございました。実際には、最後のブログで変数を取得するために意味を持っていないスレッドセーフなセキュリティバッファ変数を作ったことを言ったが、その例としては、アプリケーションが説明ソケットのほんの一例です。あなたが本当に安全変数を確保したい場合は、ビットが正常でないと思われる静的変数を使用します。
実際には、そのスレッドの安全性の変数の上に、この突然の周りの話題。今、1です。
これは、最初のローカル変数のThreadLocalやセキュリティに加えて、静的およびインスタンス変数は安全ではないことを確認する必要があります。
静的変数を初めて目:
- パッケージコム;
- / **
- * @説明変数セキュリティテスト
- * @Author Cuisu江
- * /
- パブリック クラスThreadLocalTest {
- パブリック 静的 無効メイン(文字列[] args){
- Runnableをaccumelatora = 新しいAccumulatort();
- スレッドスレッドA = 新しいスレッド(accumelatora、 "スレッドA");
- スレッドthreadb = 新しいスレッド(accumelatora、 "ThreadB");
- threada.start();
- threadb.start();
- }
- }
- クラスAccumulatort 実装Runnableを{
- //静的変数
- プライベート 静的の int型のローカル= 0;
- @SuppressWarnings("未チェック")
- 公共 のボイドの実行(){
- //静的変数
- 以下のために(INT iが= 0; I <= 10; I ++){
- ローカル+ = 1;
- {試します
- Thread.sleep(500)。
- } キャッチ(例外e){
- }
- 。のSystem.out.println(にThread.currentThread()のgetName()+ " - >"
- +ローカル)。
- }
- }
- }
コンソール出力を確認するために実行した後、変数を使用して、別のスレッドが変更された、時にはスレッドを発見するコンテンツです。
静的変数であるため、静的ストレージ、いわゆるスタティックメモリ割り当てモードは、実行中の記憶空間中の固定方法を指します。多くのスレッドが変数にアクセスしているどんなにという、セキュリティ上の問題が明らかです。
私はインスタンス変数を言ってみましょう:
- パッケージコム;
- / **
- * @説明変数セキュリティテスト
- * @Author Cuisu江
- * /
- パブリック クラスThreadLocalTest {
- パブリック 静的 無効メイン(文字列[] args){
- Runnableをaccumelatora = 新しいAccumulatort();
- スレッドスレッドA = 新しいスレッド(accumelatora、 "スレッドA");
- スレッドthreadb = 新しいスレッド(accumelatora、 "ThreadB");
- threada.start();
- threadb.start();
- }
- }
- クラスAccumulatort 実装Runnableを{
- //インスタンス変数
- int型の地元の人々 = 0;
- @SuppressWarnings("未チェック")
- 公共 のボイドの実行(){
- 以下のために(INT iが= 0; I <= 10; I ++){
- 地元の人々 + = 1;
- {試します
- Thread.sleep(1000);
- } キャッチ(例外e){
- }
- 。のSystem.out.println(にThread.currentThread()のgetName()+ " - >"
- +地元の人々)。
- }
- }
- }
たぶん、あなたはそれが安全だろうと思うが、質問の安全な操作がすぐに見つかります。
このオブジェクトのインスタンスのみがシステムに存在する場合、他のスレッドの後にスレッドを修飾されているように静的変数のような、マルチスレッド環境では、Java仮想マシンにヒープ上に割り当てられたプライベートインスタンス変数オブジェクトインスタンス、修正が表示され、それは、非スレッドセーフであり、各スレッドは、オブジェクトと相互に影響するオブジェクト間のインスタンス変数を変更し、異なる目的で実行スレッドセーフにした場合。我々は二つのスレッドを超えているが、それがターゲットであるもののそして、その代わりに、あなたは安全について考えます。
ローカル変数:
- パッケージコム;
- / **
- * @説明変数セキュリティテスト
- * @Author Cuisu江
- * /
- パブリック クラスThreadLocalTest {
- パブリック 静的 無効メイン(文字列[] args){
- Runnableをaccumelatora = 新しいAccumulatort();
- スレッドスレッドA = 新しいスレッド(accumelatora、 "スレッドA");
- スレッドthreadb = 新しいスレッド(accumelatora、 "ThreadB");
- threada.start();
- threadb.start();
- }
- }
- クラスAccumulatort 実装Runnableを{
- @SuppressWarnings("未チェック")
- 公共 のボイドの実行(){
- //ローカル変数
- int型の地元の人々 = 0;
- 以下のために(INT iが= 0; I <= 5; I ++){
- 地元の人々 + = 1;
- {試します
- Thread.sleep(1000);
- } キャッチ(例外e){
- }
- 。のSystem.out.println(にThread.currentThread()のgetName()+ " - >"
- +地元の人々)。
- }
- }
- }
あなたは数回以上実行されません、すべての権利、スレッドセーフ。
彼らのワーキングメモリのスタックフレーム上のローカル変数は、それがスレッド間で共有されていない場合、各スレッドが実行されますので、何のセキュリティ上の問題はありません。
最も一般的なマルチスレッドプログラミングはThreadLocalを考えるでしょう:
ThreadLocalのデータでは、マルチスレッドのデータを解決するために、主に機会を使用してによる同時には矛盾が発生します。実行するためにビジネスを訪問し、コピーのコピーの各スレッド内のデータへの同時アクセスを提供するのThreadLocal、このような結果は、シングルスレッドの同期は、パフォーマンスが大幅に起因する消費を削減するだけでなく、スレッドの同時実行制御の複雑さを軽減し、メモリを消費しています程度。
このクラスはスレッドローカル(スレッドローカル)変数を提供します。変数へのアクセスが(そこを通っているため、これらの変数は、その正常な対応とは異なり 、GET または セット 方法)各スレッドは、変数の初期化コピーとは独立した独自のローカル変数を持っています。ThreadLocalの クラスの例として、典型的にはプライベート静的フィールド、それらは一つのスレッド(例えば、ユーザIDまたはトランザクションID)を述べることを望む関連しています。
- パッケージコム;
- / **
- * @説明変数セキュリティテスト
- * @Author Cuisu江
- * /
- パブリック クラスThreadLocalTest {
- //スレッドセーフな変数
- @SuppressWarnings("未チェック")
- 公共の 静的なThreadLocalのTHREADLOCAL = 新しいのThreadLocal();
- パブリック 静的 無効メイン(文字列[] args){
- Runnableをaccumelatora = 新しいAccumulatort();
- スレッドスレッドA = 新しいスレッド(accumelatora、 "スレッドA");
- スレッドthreadb = 新しいスレッド(accumelatora、 "ThreadB");
- threada.start();
- threadb.start();
- }
- }
- クラスAccumulatort 実装Runnableを{
- @SuppressWarnings("未チェック")
- 公共 のボイドの実行(){
- //スレッドの安全性試験
- ThreadLocalのTHREADLOCAL = ThreadLocalTest.threadLocal。
- 以下のために(INT iが= 1; I <= 10; I ++){
- もし(threadLocal.get()== nullの)
- threadLocal.set(新しい整数(0));
- INT X =((整数)threadLocal.get())intValue()。
- X + = 1;
- threadLocal.set(新しい整数(X));
- {試します
- Thread.sleep(1000);
- } キャッチ(InterruptedExceptionある電子){
- }
- 。のSystem.out.println(にThread.currentThread()のgetName()+ " - >"
- +((整数)threadLocal.get())intValue())。
- }
- }
- }
実際には、上記のコードは、各スレッドは、変数の独自のコピーを持っていますので、セキュリティ上の問題は存在しません。
それと彼らはスレッドセーフ、その差が、不可欠のためのものであるものの、同期の違いについて。
ロック機構、時可変コードブロック、またはアクセスへの唯一のスレッドを使用して同期。訪問の時の各スレッドは、このようにデータ共有のためのデータの複数のスレッドを単離し、同じオブジェクトでないようにThreadLocalは、各スレッドは、変数のコピーを提供します。同期ちょうど反対に、共有データへの複数のスレッド間で得ることができる通信時に使用されます。スレッド間のデータ共有のための同期、およびThreadLocalのデータの分離は、スレッド間で使用されます。同期のためのコースThreadLocalのではなく、代替のうち、彼らは別の問題領域を扱います。同期は、マルチスレッド環境の同期プロセスデータに使用されているが、唯一のいくつかの州民間現在のThreadLocalのスレッドを保存します。