ベクトル、ハッシュテーブル、スレッドセーフの例

この下にはベクトルのスレッドセーフな文言を書きました:

インポートのjava.util.Vector; 
 
パブリック クラスのテスト{ 
      プライベート 静的ベクトル<整数>ベクトル= 新しいベクトル<整数> (); 
 
        パブリック 静的 ボイドメイン(文字列[]引数){
             一方){
                 ためint型 i = 0; iは<10; I ++ ){ 
                    するSystem.out.println( "添加" )。
                    vector.add(I); 
                } 
 
                スレッドremoveThread = 新しいスレッド(新しいRunnableを(){
                    @Override
                    公共 のボイドの実行(){
                         のためにint型私= 0;私は++; iがvector.size()< {)
                            のSystem.out.println( "removeThreadを删除" ); 
                            vector.remove(I); 
                        } 
                    } 
                })。
 
                printThreadスレッド = 新しいスレッド(新しいRunnableを(){ 
                    @Override 
                    公共 ボイドラン(){
                         のためにint型私は++;私はvector.sizeを()<; I = 0を{)
                            System.out.println( "PrintThreadをゲット" ); 
 
                            System.out.printlnは((vector.get(I))); 
                        } 
                    } 
                }); 
 
                removeThread.start(); 
                printThread.start(); 
 
                // 同時に発生しません。あまりにも多くのスレッドが、それ以外の場合は、オペレーティングシステムがアニメーションを中断原因となり
               、一方(Thread.activeCount()> 20 ); 
            } 
        } 
  } }

  ベクトルGET()、)(、)(削除取得しても方法が同期されているが、私は上記のプログラムに次のエラーを実行します。

java.langで。ArrayIndexOutOfBoundsException:範囲外の配列インデックス:0 
    java.util.Vector.getで(Vector.java: 744 
    テストの$で 2.run(Test.java:29 
    :java.lang.Thread.run(Thread.javaで 722 
スレッドの例外範囲外の配列インデックス:0 "スレッド14857" java.lang.ArrayIndexOutOfBoundsException 
    java.util.Vector.getで(Vector.java: 744 
    テストの$で 2.run(Test.java:29 )

ハッシュテーブルのスレッドセーフな言葉遣い:

インポートするjava.util.Hashtable;
輸入java.util.Map; 
 
パブリック クラスHashmapTest { 
    
     プライベート  静的な地図<整数、整数>ハッシュテーブル= 新しい Hashtableの<整数、整数> ();
      パブリック 静的 ボイドメイン(文字列[]引数){
        一方){
            ためint型 i = 0; iは<10; I ++ ){ 
                   するSystem.out.println( "添加" )。
                 hashtable.put(I、I); 
           } 
           スレッドremoveThread = 新しいスレッド(新しいRunnableを(){ 
            @Override 
            公共 ボイドラン(){ 
             それはイテレータ = )hashtable.entrySet(イテレータ();
                  一方、(it.hasNext()){ 
                  のMap.Entry <整数整数= "">エントリ=(エントリ<整数整数= ""> )it.next();  
                           System.out.println( "この削除します。 "+ entry.getKey()+" ===" + entry.getValueを());  
                            it.remove();
                     
            Runnableを(){
            公共 のボイドの実行(){
                  のためにint型私= 0;私は++; iがhashtable.size()< {)
                     のSystem.out.println( "getThreadを获取" ); 
                     System.out.println((hashtable.get(I))); 
                 }             
            } 
        })。
           removeThread.start(); 
           getThread.start(); 
          一方、(Thread.activeCount()> 20 )。
         } 
      } 
}

  そこなぜならそのキーなしで、NULL値の多くが、良いだろうが、文句はありません

getThread GET
 ヌル
getThread GET 
ヌル

  最後に、メソッド呼び出しの追加同期対策をしない場合は、単に間違った時間別のスレッドが要素を削除する場合ので、マルチスレッド環境では、このスレッドの使用は意志、私はそれが利用可能であるでない場合、メソッドを取得し、その結果、まだ安全ではありませんArrayIndexOutOfBoundsExceptionがスローを

インポートのjava.util.Vector; 
 
パブリック クラスのテスト{ 
      プライベート 静的ベクトル<整数>ベクトル= 新しいベクトル<整数> (); 
 
        パブリック 静的 ボイドメイン(文字列[]引数){
             一方){
                 ためint型 i = 0; iは<10; I ++ ){ 
                    するSystem.out.println( "添加" )。
                    vector.add(I); 
                } 
 
                スレッドremoveThreadは = 新しいスレッド(新しいRunnableを(){
                    @Override 
                    公共 ボイドラン(){
                         同期(ベクトル){
                              ためint型 i = 0; iは++; iがvector.size()< {)
                                  のSystem.out.println( "removeThreadを删除" )。
                                  vector.remove(I); 
                              } 
                        } 
                    } 
                })。
 
                スレッドprintThread = 新しいスレッド(新しいRunnableを(){ 
                    @Override 
                    公衆 のボイド RUN(){
                         同期(ベクター){
                        のためにint型 ;)私は(vector.sizeを<;私は= 0私は++ ){ 
                            System.out.printlnは( "PrintThreadゲット" ); 
 
                            System.out.printlnはを((vector.get (I))); 
                        } 
                        } 
                    } 
                }); 
 
                removeThread.start(); 
                printThread.start(); 
 
                //は、あまりにも多くのスレッドを生成しないでください、それ以外の場合は、オペレーティング・システムは、アニメーションを中断させます
               しばらく(Thread.activeCount()> 20 ) ; 
            } 
      } 
 }

おすすめ

転載: www.cnblogs.com/jing99/p/11306496.html