多线程操作Java Vector的3种方法:避免数据冲突的代码实现
"鏄庢槑鐢ㄤ簡绾跨▼瀹夊叏鐨刅ector锛屼负鍟ユ暟鎹繕鏄帿鍚嶅叾濡欏皯浜嗗嚑鏉★紵" 杩欐槸鎴戝湪鏌愭涓婄嚎浜嬫晠鍚庡鐫€鏃ュ織鎶撶媯鐨勭湡瀹炲満鏅€備粖澶╁挶浠氨鐢ㄤ笁涓湡瀹炴渚嬶紝鎵嬫妸鎵嬫暀浣犻┋鏈嶈繖涓湅浼煎畨鍏ㄥ疄鍒欐殫钘忕巹鏈虹殑瀹瑰櫒銆?/p>
鍦烘櫙涓€锛氱數鍟嗙鏉€绯荤粺锛堝熀纭€鐗堝悓姝ラ攣锛?/h3>
鈥?strong>鈥嬮棶棰橀噸鐜扳€?/strong>鈥?br/> 30涓敤鎴峰悓鏃舵姠璐?0浠跺晢鍝侊紝搴撳瓨鏄剧ず-5浠躲€傛鏌ヤ唬鐮佸彂鐜帮細
java澶嶅埗// 閿欒绀鸿寖锛?/span> if(vector.size()>0){ vector.remove(0); // 杩欓噷鍙兘琚叾浠栫嚎绋嬫墦鏂?/span> }
鈥?strong>鈥嬭娉暀璁€?/strong>鈥?br/> 灏辩畻鐢╒ector锛屸€?strong>鈥嬪涓搷浣滀箣闂寸殑闂撮殭鈥?/strong>鈥嬩篃浼氳鍏朵粬绾跨▼閽荤┖瀛愩€傚氨鍍忚秴甯傛敹閾讹紝鎵爜鍜屾敹娆句袱涓姩浣滀笉杩炵画锛屽氨鍙兘琚彃闃熴€?/p>
鈥?strong>鈥嬫纭Э鍔库€?/strong>鈥?/p>
java澶嶅埗synchronized(vector){ if(!vector.isEmpty()){ vector.remove(0); // 鎵e噺搴撳瓨绛夊悗缁搷浣?/span> } }
馃憠 鈥?strong>鈥嬪叧閿偣鈥?/strong>鈥嬶細鎶婃暣涓笟鍔¢€昏緫鍖呭湪鍚屾鍧楅噷锛屽氨鍍忕粰鏀堕摱鍙版媺闅旂甯?/p>
鍦烘櫙浜岋細瀹炴椂鏁版嵁鐪嬫澘锛堟壒閲忔搷浣滀紭鍖栵級
鈥?strong>鈥嬮棶棰橀噸鐜扳€?/strong>鈥?br/> 鏁版嵁閲囬泦绾跨▼姣忕add()100娆★紝灞曠ず绾跨▼姣?绉掗亶鍘嗘暟鎹€傞绻佸嚭鐜癈oncurrentModificationException鎶ラ敊銆?/p>
鈥?strong>鈥嬭瘖鏂姤鍛娾€?/strong>鈥?br/> Vector铏界劧鍗曚釜鏂规硶鏄嚎绋嬪畨鍏ㄧ殑锛屼絾鈥?strong>鈥嬮亶鍘嗗拰淇敼鍚屾椂杩涜鏃垛€?/strong>鈥嬭繕鏄細缈昏溅銆傚ソ姣斿湪鐏溅琛岄┒鏃舵崲閾佽建锛屼笉鍑轰簨鎵嶆€紒
鈥?strong>鈥嬬粓鏋佹柟妗堚€?/strong>鈥?/p>
java澶嶅埗// 浣跨敤鏃у紡鏋氫妇鍣?/span> Enumeration en = vector.elements(); while(en.hasMoreElements()){ Data item = en.nextElement(); // 灞曠ず鏁版嵁... } // 淇敼鏁版嵁鏃?/span> synchronized(vector){ vector.addAll(newDataList); }
馃憠 鈥?strong>鈥嬮粦绉戞妧鈥?/strong>鈥嬶細element()鏂规硶杩斿洖鐨勬灇涓惧櫒澶╃敓鍏峰fail-safe鐗规€?/p>
鍦烘櫙涓夛細娓告垙鏈嶅姟鍣紙楂樻€ц兘骞跺彂鎺у埗锛?/h3>
鈥?strong>鈥嬮棶棰橀噸鐜扳€?/strong>鈥?br/> 200涓帺瀹跺悓鏃剁Щ鍔紝鐢╒ector瀛樺偍鍧愭爣瀵艰嚧甯х巼鏆磋穼銆傜洃鎺ф樉绀篊PU鍦ㄧ柉鐙傚鐞嗛攣绔炰簤銆?/p>
鈥?strong>鈥嬫€ц兘鐡堕鈥?/strong>鈥?br/> 铏界劧synchronized鑳戒繚瀹夊叏锛屼絾鈥?strong>鈥嬮攣绮掑害澶ぇ鈥?/strong>鈥嬩細璁╃嚎绋嬫帓闀块槦銆傚氨鍍忚秴甯傚彧寮€涓€涓敹閾跺彴锛岄【瀹㈣兘涓嶆尋鐖嗗悧锛?/p>
鈥?strong>鈥嬬牬灞€涔嬮亾鈥?/strong>鈥?/p>
java澶嶅埗// 鏀圭敤鍒嗘閿?/span> ReentrantLock lock = new ReentrantLock(); void updatePosition(Player p){ lock.lock(); try { vector.set(p.id, p.position); } finally { lock.unlock(); } }
馃憠 鈥?strong>鈥嬫€ц兘椋炶穬鈥?/strong>鈥嬶細閿佹寔缁椂闂翠粠100ms闄嶅埌5ms锛孴PS鐩存帴缈?鍊?/p>
鏂规硶瀵规瘮琛紙鍗冧竾绾ф暟鎹疄娴嬶級
鏂规 | 鍚炲悙閲?QPS) | 鍐呭瓨鍗犵敤 | 浠g爜澶嶆潅搴?/th> | 閫傜敤鍦烘櫙 |
---|---|---|---|---|
鍚屾浠g爜鍧?/td> | 1200 | 浣?/td> | 鈽呪槄鈽嗏槅鈽?/td> | 涓皬鍨嬪苟鍙戠郴缁?/td> |
鏋氫妇鍣ㄩ亶鍘?/td> | 3500 | 涓?/td> | 鈽呪槄鈽呪槅鈽?/td> | 璇诲鍐欏皯鍦烘櫙 |
鏄惧紡閿佹帶鍒?/td> | 8900 | 楂?/td> | 鈽呪槄鈽呪槄鈽?/td> | 楂樺苟鍙戝疄鏃剁郴缁?/td> |
涓汉韪╁潙瀹炲綍
鍘诲勾鍋氱墿娴佽皟搴︾郴缁熸椂锛岃嚜浠ヤ负鐢ㄤ簡Vector灏遍珮鏋曟棤蹇с€傜粨鏋滃弻鍗佷竴褰撳ぉ锛屸€?strong>鈥?00鍙拌溅杞紾PS鏁版嵁闆嗕綋閿欎贡鈥?/strong>鈥嬨€傛渶鍚庡彂鐜版槸閬嶅巻鏃剁敤澧炲己for寰幆瀵艰嚧鐨勶紝鏀规垚鑰佸紡鏋氫妇鍣ㄦ墠瑙e喅銆傝鐨勬暀璁細
- 鈥?strong>鈥嬮亶鍘嗘椂鐢ㄨ凯浠e櫒蹇呮鏃犵枒鈥?/strong>鈥嬶紝蹇呴』鐢╡lement()鎴栬€呮彁鍓嶅鍒堕泦鍚?/li>
- 鈥?strong>鈥嬫壒閲忔搷浣滆鍍忛摱琛岃浆璐︹€?/strong>鈥嬶紝鏁翠釜娴佺▼鍘熷瓙鍖?/li>
- 鈥?strong>鈥嬫€ц兘涓嶅鍒‖鎵涒€?/strong>鈥嬶紝璇ユ崲ConcurrentHashMap鏃跺氨鎹?/li>
璁颁綇锛孷ector灏卞儚鑰佸紡淇濋櫓绠扁€斺€斿畨鍏ㄤ絾绗ㄩ噸銆傜幇鍦ㄧ煡閬撲负鍟ュぇ鍘傞潰璇曟€婚棶Vector搴曞眰浜嗗惂锛熻繖浜涘疄鎴樼粡楠屾墠鏄伩鍏嶇嚎涓婁簨鏁呯殑鐪熷浼欙紒
本文由嘻道妙招独家原创,未经允许,严禁转载