この下にはベクトルのスレッドセーフな文言を書きました:
インポートの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 ) ; } } }