كما نعلم جميعًا ، فإن المتجهات والعلامة آمنة في Java. لذلك ، لن تكون هناك مشاكل في تشغيل المتجه والعلامة. ولكن هناك موقف: عند نسخ علامة تجزئة إلى علامة تجارية أخرى ، إذا تم استخدام زهرة طريقة PutAll ، فسيتم إلقاء java.util.concurrentModificationexception. قم بتحميل الرمز أولاً:
testsync.java
نسخة الكود كما يلي:
الطبقة العامة testsync
{
/**
* رئيسي (أستخدم جملة واحدة لوصف وظيفة هذه الطريقة)
* (الشروط المعمول بها لهذه الطريقة موصوفة هنا)
* param args
* return void
* @استثناء
* since 1.0.0
*/
الفراغ الثابت العام (سلسلة [] args)
{
Map <Integer ، user> list = new hashtable <integer ، user> () ؛
قائمة <Sether> Vec = New Vector <Serve> () ؛
TestThread Thread = New TestTrheRead () ؛
thread.start () ؛
int i = 0 ؛
بينما (أنا <1000)
{
i ++ ؛
System.out.println ("iiiiiiiiiiii = ---------------------" + i) ؛
list.clear () ؛
vec.clear () ؛
// متجه وعلامة علامة التجزئة آمنين ، وتنفيذ المجموعتين في طريقة PutAll مختلفة
Vec.Addall (constans.uservec) ؛
// متزامن (constans.userlist)
// {
list.putall (constans.userList) ؛
//}
System.out.println ("---------" + list.size ()) ؛
System.out.println ("---------" + vec.size ()) ؛
}
System.out.println ("Over --------------------------------------------- --- ") ؛
}
}
constans الطبقة
{
الخريطة الثابتة العامة <integer ، user> userlist = new hashtable <integer ، user> () ؛
القائمة الثابتة العامة <Sether> uservec = new vector <Sether> () ؛
}
اختبار الفئة يمتد الموضوع
{
@تجاوز
تشغيل الفراغ العام ()
{
لـ (int i = 0 ؛ i <100000 ؛ i ++)
{
مستخدم المستخدم = مستخدم جديد () ؛
user.setId (i) ؛
user.setName ("name" + i) ؛
if (! constans.userlist.containskey (i))
{
constans.userList.put (i ، user) ؛
constans.uservec.add (المستخدم) ؛
}
}
System.out.println ("Thread End -------------------------------------- ------------------------------------------------- ---------------------
}
}
عندما نفعل
نسخة الكود كما يلي:
// متزامن (constans.userlist)
// {
list.putall (constans.userList) ؛
//}
عند عدم استخدام التزامن ، يتم إلقاء استثناء. ذلك لأن constans.userlist غير متزامن ، بدلاً من طريقة putAll ليست آمنة.
الفرق بين المتجه وعلم التجزئة هو أن طريقة Addall الخاصة بالمتجه يمكن أن تعمل بشكل طبيعي دون المزامنة.
user.java
نسخة الكود كما يلي:
مستخدم الطبقة العامة
{
معرف int الخاص ؛
اسم السلسلة الخاصة ؛
الجمهور int getID ()
{
معرف الإرجاع ؛
}
setid public void (int id)
{
this.id = id ؛
}
السلسلة العامة getName ()
{
اسم العودة
}
setName public void (اسم السلسلة)
{
this.name = name ؛
}
}
أنا لا أكتب بشكل جيد ، الجميع يغفر لي.