私たち全員が知っているように、ベクターとハッシュテーブルはJavaのスレッドセーフです。したがって、ベクターとハッシュテーブルの動作に問題はありません。しかし、状況があります。ハッシュテーブルを別のハッシュテーブルにコピーすると、putallメソッドの花が使用される場合、java.util.concurrentModificationexceptionがスローされます。最初にコードをアップロードします。
testsync.java
コードコピーは次のとおりです。
パブリッククラスのtestsync
{
/**
* Main(私はこの方法の機能を説明するために1つの文を使用しています)
*(この方法に該当する条件について説明します)
* @param args
* @return void
* @例外
* @since 1.0.0
*/
public static void main(string [] args)
{
map <integer、user> list = new hashtable <integer、user>();
list <user> vec = new Vector <user>();
testThreadスレッド= new testThread();
thread.start();
int i = 0;
while(i <1000)
{
i ++;
System.out.println( "iiiiiiiiiii = ------------------" + i);
list.clear();
vec.clear();
//ベクトルとハッシュテーブルはスレッドセーフであり、putallメソッドの2つのセットの実装は異なります
vec.addall(constans.uservec);
//同期(constans.userlist)
// {
list.putall(constans.userlist);
//}
System.out.println( "---------" + list.size());
system.out.println( "--------" + vec.size());
}
System.out.println( "オーバー--------------------------------------------------------------------------------------------------------- --- ");
}
}
クラスのコンスタン
{
public static Map <integer、user> userlist = new Hashtable <integer、user>();
public static list <user> uservec = new vector <user>();
}
クラスTestThreadはスレッドを拡張します
{
@オーバーライド
public void run()
{
for(int i = 0; i <100000; i ++)
{
user user = new user();
user.setId(i);
user.setname( "name" + i);
if(!constans.userlist.containskey(i))
{
constans.userlist.put(i、user);
constans.uservec.add(user);
}
}
System.out.println( "スレッドエンド------------------------------------------------------------------------------------- -------------------------------------------------------------- -----------------------------
}
}
私たちがするとき
コードコピーは次のとおりです。
//同期(constans.userlist)
// {
list.putall(constans.userlist);
//}
同期が使用されない場合、例外がスローされます。それは、constans.userlistがputallメソッドではなく同期されていないためです。
ベクトルとハッシュテーブルの違いは、ベクトルの追加方法が同期せずに実行できることです。
user.java
コードコピーは次のとおりです。
パブリッククラスユーザー
{
private int id;
プライベート文字列名;
public int getid()
{
IDを返します。
}
public void setid(int id)
{
this.id = id;
}
public string getName()
{
返品名;
}
public void setName(文字列名)
{
this.name = name;
}
}
私はよく書いていません、誰もが私を許します。