Java 八鏃犱汉璋堝強鐨勫叓澶у姛鑳
鏃堕棿鎴抽攣
涓€鐩翠互鏉ワ紝澶氱嚎绋嬩唬鐮佹槸鏈嶅姟鍣ㄥ紑鍙戜汉鍛樼殑姣掕嵂锛堥棶闂甇racle鐨凧ava璇█鏋舵瀯甯堝拰骞惰寮€鍙戝ぇ甯圔rian Goetz锛夈€侸ava鐨勬牳蹇冨簱涓嶆柇鍔犲叆鍚勭澶嶆潅鐨勭敤娉曟潵鍑忓皯璁块棶鍏变韩璧勬簮鏃剁殑绾跨▼绛夊緟鏃堕棿銆傚叾涓箣涓€灏辨槸缁忓吀鐨勮鍐欓攣锛圧eadWriteLock锛夛紝 瀹冭浣犳妸浠g爜鍒嗘垚涓ら儴鍒嗭細闇€瑕佷簰鏂ョ殑鍐欐搷浣滃拰涓嶉渶瑕佷簰鏂ョ殑璇绘搷浣溿€?/p>
琛ㄩ潰涓婄湅璧锋潵寰堜笉閿欍€傞棶棰樻槸璇诲啓閿佹湁鍙兘鏄瀬鎱㈢殑锛堟渶澶?0鍊嶏級锛岃繖宸茬粡鍜屽畠鐨勫垵琛风浉鎮栦簡銆侸ava 8寮曞叆浜嗕竴绉嶆柊鐨勮鍐欓攣鈥斺€斿彨鍋氭椂闂存埑閿併€傚ソ娑堟伅鏄繖涓浼欑湡鐨勯潪甯稿揩銆傚潖娑堟伅鏄畠浣跨敤璧锋潵鏇村鏉傦紝鏈夋洿澶氱殑鐘舵€侀渶瑕佸鐞嗐€傚苟涓斿畠鏄笉鍙噸鍏ョ殑锛岃繖鎰忓懗鐫€ 涓€涓嚎绋嬫湁鍙兘璺熻嚜宸辨閿併€?/p>
鏃堕棿鎴抽攣鏈変竴绉嶁€滀箰瑙傗€濇ā寮忥紝鍦ㄨ繖绉嶆ā寮忎笅姣忔鍔犻攣鎿嶄綔閮戒細杩斿洖涓€涓椂闂存埑浣滀负鏌愮鏉冮檺鍑瘉锛涙瘡娆¤В閿佹搷浣滈兘闇€瑕佹彁渚涘畠瀵瑰簲鐨勬椂闂存埑銆傚鏋滀竴涓嚎绋?鍦ㄨ姹備竴涓啓鎿嶄綔閿佺殑鏃跺€欙紝杩欎釜閿佺宸у凡缁忚涓€涓鎿嶄綔鎸佹湁锛岄偅涔堣繖涓鎿嶄綔鐨勮В閿佸皢浼氬け鏁堬紙鍥犱负鏃堕棿鎴冲凡缁忓け鏁堬級銆傝繖涓椂鍊欏簲鐢ㄧ▼搴忛渶瑕佷粠澶村啀鏉ワ紝涔熻 瑕佷娇鐢ㄦ偛瑙傛ā寮忕殑閿侊紙鏃堕棿鎴抽攣涔熸湁瀹炵幇锛夈€備綘闇€瑕佽嚜宸辨悶瀹氳繖涓€鍒囷紝骞朵笖涓€涓椂闂存埑鍙兘瑙i攣瀹冨搴旂殑閿佲€斺€旇繖涓€鐐瑰繀椤婚潪甯稿皬蹇冦€?/p>
涓嬮潰鎴戜滑鏉ョ湅涓€涓嬭繖绉嶉攣鐨勫疄渚嬧€斺€?/p>
long stamp = lock.tryOptimisticRead(); // 闈為樆濉炶矾寰勨€斺€旇秴绾у揩 work(); // 鎴戜滑甯屾湜涓嶈鏈夊啓鎿嶄綔鍦ㄨ繖鏃跺彂鐢? if (lock.validate(stamp)){ //鎴愬姛锛佹病鏈夊啓鎿嶄綔骞叉壈 } else { //鑲畾鍚屾椂鏈夊彟澶栦竴涓嚎绋嬭幏寰椾簡鍐欐搷浣滈攣锛屾敼鍙樹簡鏃堕棿鎴? //鎳掓眽璇粹€斺€旀垜浠垏鎹㈠埌寮€閿€鏇村ぇ鐨勯攣鍚? stamp = lock.readLock(); //杩欐槸浼犵粺鐨勮鎿嶄綔閿侊紝浼氶樆濉? try { //鐜板湪涓嶅彲鑳芥湁鍐欐搷浣滃彂鐢熶簡 work(); } finally { lock.unlock(stamp); // 浣跨敤瀵瑰簲鐨勬椂闂存埑瑙i攣 } }
骞跺彂鍔犳硶鍣?
Java 8鍙︿竴涓嚭鑹茬殑鍔熻兘鏄苟鍙戔€滃姞娉曞櫒鈥濓紝瀹冨澶ц妯¤繍琛岀殑浠g爜灏ゅ叾鏈夋剰涔夈€備竴绉嶆渶鍩烘湰鐨勫苟鍙戞ā寮忓氨鏄涓€涓鏁板櫒鐨勮鍐欍€傚氨鍏舵湰韬€岃█锛岀幇浠婂鐞嗚繖涓棶棰樻湁寰堝鏂规硶锛屼絾鏄病鏈変竴绉嶈兘姣擩ava 8鎻愪緵鐨勬柟娉曢珮鏁堟垨浼橀泤銆?/p>
鍒扮洰鍓嶄负姝紝杩欎釜闂鏄敤鍘熷瓙绫伙紙Atomics锛夋潵瑙e喅鐨勶紝瀹冪洿鎺ュ埄鐢ㄤ簡CPU鐨勨€滄瘮杈冨苟浜ゆ崲鈥濇寚浠わ紙CAS锛夋潵娴嬭瘯骞惰缃鏁板櫒鐨勫€笺€傞棶棰樺湪浜?褰撲竴鏉AS鎸囦护鍥犱负绔炰簤鑰屽け璐ョ殑鏃跺€欙紝AtomicInteger绫讳細姝荤瓑锛屽湪鏃犻檺寰幆涓笉鏂皾璇旵AS鎸囦护锛岀洿鍒版垚鍔熶负姝€傚湪鍙戠敓绔炰簤姒傜巼寰堥珮鐨勭幆澧?涓紝杩欑瀹炵幇琚瘉鏄庢槸闈炲父鎱㈢殑銆?/p>
鏉ョ湅Java 8鐨凩ongAdder銆傝繖涓€绯诲垪绫讳负澶ч噺骞惰璇诲啓鏁板€肩殑浠g爜鎻愪緵浜嗘柟渚跨殑瑙e喅鍔炴硶銆備娇鐢ㄨ秴绾х畝鍗曘€傚彧瑕佸垵濮嬪寲涓€涓狶ongAdder瀵硅薄骞朵娇鐢ㄥ畠鐨刟dd()鍜宨ntValue()鏂规硶鏉ョ疮鍔犲拰閲囨牱璁℃暟鍣ㄣ€?/p>
杩欏拰鏃х殑Atomic绫荤殑鍖哄埆鍦ㄤ簬锛屽綋CAS鎸囦护鍥犱负绔炰簤鑰屽け璐ユ椂锛孉dder涓嶄細涓€鐩村崰鐫€CPU锛岃€屾槸涓哄綋鍓嶇嚎绋嬪垎閰嶄竴涓唴閮╟ell瀵硅薄鏉ュ瓨鍌?璁℃暟鍣ㄧ殑澧為噺銆傜劧鍚庤繖涓€煎拰鍏朵粬寰呭鐞嗙殑cell瀵硅薄涓€璧疯鍔犲埌intValue()鐨勭粨鏋滀笂銆傝繖鍑忓皯浜嗗弽澶嶄娇鐢–AS鎸囦护鎴栭樆濉炲叾浠栫嚎绋嬬殑鍙兘鎬с€?/p>
濡傛灉浣犻棶浣犺嚜宸憋紝浠€涔堟椂鍊欏簲璇ョ敤骞跺彂鍔犳硶鍣ㄨ€屼笉鏄師瀛愮被鏉ョ鐞嗚鏁板櫒锛熺畝鍗曠殑绛旀灏辨槸鈥斺€斾竴鐩磋繖涔堝仛銆?/p>
骞惰鎺掑簭
姝e儚骞跺彂鍔犳硶鍣ㄨ兘鍔犻€熻鏁颁竴鏍凤紝Java 8杩樺疄鐜颁簡涓€绉嶇畝娲佺殑鏂规硶鏉ュ姞閫熸帓搴忋€傝繖涓璇€寰堢畝鍗曘€備綘涓嶅啀杩欎箞鍋氾細
Array.sort(myArray);
鑰屾槸杩欎箞鍋氾細
Arrays.parallelSort(myArray);
杩欎細鑷姩鎶婄洰鏍囨暟缁勫垎鍓叉垚鍑犱釜閮ㄥ垎锛岃繖浜涢儴鍒嗕細琚斁鍒扮嫭绔嬬殑CPU鏍镐笂鍘昏繍琛岋紝鍐嶆妸缁撴灉鍚堝苟璧锋潵銆傝繖閲屽敮涓€闇€瑕佹敞鎰忕殑鏄紝鍦ㄤ竴涓ぇ閲忎娇鐢ㄥ绾跨▼鐨勭幆澧冧腑锛屾瘮濡備竴涓箒蹇欑殑Web瀹瑰櫒锛岃繖绉嶆柟娉曠殑濂藉灏变細鍑忓急锛堥檷浣?0%浠ヤ笂锛夛紝鍥犱负瓒婃潵瓒婂鐨凜PU涓婁笅鏂囧垏鎹㈠鍔犱簡寮€閿€銆?/p>
鍒囨崲鍒版柊鐨勬棩鏈熸帴鍙?/h2>
Java 8寮曞叆浜嗗叏鏂扮殑date-time鎺ュ彛銆傚綋鍓嶆帴鍙g殑澶у鏁版柟娉曢兘宸茶鏍囪涓篸eprecated锛屼綘灏辩煡閬撴槸鏃跺€欐帹鍑烘柊鎺ュ彛浜嗐€傛柊鐨勬棩鏈熸帴鍙d负Java鏍?蹇冨簱甯︽潵浜嗘槗鐢ㄦ€у拰鍑嗙‘鎬э紝鑰屼互鍓嶅彧鑳界敤Joda time鎵嶈兘杈惧埌杩欐牱鐨勬晥鏋滐紙璇戣€呮敞锛欽oda time鏄竴涓涓夋柟鐨勬棩鏈熷簱锛屾瘮Java鑷甫鐨勫簱鏇村弸濂芥洿鏄撲簬绠$悊锛夈€?/p>
璺熶换浣曟柊鎺ュ彛涓€鏍凤紝濂芥秷鎭槸鎺ュ彛鍙樺緱鏇翠紭闆呮洿寮哄ぇ銆備絾涓嶅垢鐨勬槸杩樻湁澶ч噺鐨勪唬鐮佸湪浣跨敤鏃ф帴鍙o紝杩欎釜鐭椂闂村唴涓嶄細鏈夋敼鍙樸€?/p>
涓轰簡琛旀帴鏂版棫鎺ュ彛锛屽巻鍙叉偁涔呯殑Date绫绘柊澧炰簡toInstant()鏂规硶锛岀敤浜庢妸Date杞崲鎴愭柊鐨勮〃绀哄舰寮忋€傚綋浣犳棦瑕佷韩鍙楁柊鎺ュ彛甯︽潵鐨勫ソ澶勶紝鍙堣鍏奸【閭d簺鍙帴鍙楁棫鐨勬棩鏈熻〃绀哄舰寮忕殑鎺ュ彛鏃讹紝杩欎釜鏂规硶浼氭樉寰楀挨鍏堕珮鏁堛€?/p>
鎺у埗鎿嶄綔绯荤粺杩涚▼
鎯冲湪浣犵殑浠g爜閲屽惎鍔ㄤ竴涓搷浣滅郴缁熻繘绋嬶紝閫氳繃JNI璋冪敤灏辫兘瀹屾垚鈥斺€斾絾杩欎釜涓滆タ鎬讳护浜轰竴鐭ュ崐瑙o紝浣犲緢鏈夊彲鑳藉緱鍒颁竴涓剰鎯充笉鍒扮殑缁撴灉锛屽苟涓斾竴璺即闅忕潃涓€浜涘緢绯熺硶鐨勫紓甯搞€?/p>
鍗充究濡傛锛岃繖鏄棤娉曢伩鍏嶇殑浜嬫儏銆備絾杩涚▼杩樻湁涓€涓鍘岀殑鐗规€у氨鏄€斺€斿畠浠悶涓嶅ソ灏变細鍙樻垚鍍靛案杩涚▼銆傜洰鍓嶄粠Java涓繍琛岃繘绋嬪甫鏉ョ殑闂鏄紝杩涚▼涓€鏃﹀惎鍔ㄥ氨寰堥毦鍘绘帶鍒跺畠銆?/p>
涓轰簡甯垜浠В鍐宠繖涓棶棰橈紝Java 8鍦≒rocess绫讳腑寮曞叆浜嗕笁涓柊鐨勬柟娉?/p>
- destroyForcibly鈥斺€旂粨鏉熶竴涓繘绋嬶紝鎴愬姛鐜囨瘮浠ュ墠楂樺緢澶氥€?/li>
- isAlive鈥斺€旀煡璇綘鍚姩鐨勮繘绋嬫槸鍚﹁繕娲荤潃銆?/li>
- 閲嶈浇浜唚aitFor()锛屼綘鐜板湪鍙互鎸囧畾绛夊緟杩涚▼缁撴潫鐨勬椂闂翠簡銆傝繘绋嬫垚鍔熼€€鍑哄悗杩欎釜鎺ュ彛浼氳繑鍥烇紝瓒呮椂鐨勮瘽涔熶細杩斿洖锛屽洜涓轰綘鏈夊彲鑳借鎵嬪姩缁堟瀹冦€?/li>
杩欓噷鏈変袱涓叧浜庡浣曚娇鐢ㄨ繖浜涙柊鏂规硶鐨勫ソ渚嬪瓙鈥斺€?/p>
- 濡傛灉杩涚▼娌℃湁鍦ㄨ瀹氭椂闂村唴閫€鍑猴紝缁堟瀹冨苟缁х画寰€鍓嶈蛋銆?/li>
if (process.wait(MY_TIMEOUT, TimeUnit.MILLISECONDS)){ //鎴愬姛 } else { process.destroyForcibly(); }
- 鍦ㄤ綘鐨勪唬鐮佺粨鏉熷墠锛岀‘淇濇墍鏈夌殑杩涚▼閮藉凡閫€鍑恒€傚兊灏歌繘绋嬩細閫愭笎鑰楀敖绯荤粺璧勬簮銆?
for (Process p : processes) { if (p.isAlive()) { p.destroyForcibly(); } }
绮剧‘鐨勬暟瀛楄繍绠?/h2>
鏁板瓧婧㈠嚭浼氬鑷翠竴浜涜鍘岀殑bug锛屽洜涓哄畠鏈川涓婁笉浼氬嚭閿欍€傚湪涓€浜涚郴缁熶腑锛屾暣鍨嬪€间笉鍋滃湴澧為暱锛堟瘮濡傝鏁板櫒锛夛紝婧㈠嚭鐨勯棶棰樺氨灏や负涓ラ噸銆傚湪杩欎簺妗堜緥閲岄潰锛?浜у搧鍦ㄦ紨杩涢樁娈佃繍琛屽緱寰堝ソ锛岀敋鑷冲晢鐢ㄥ悗鐨勫緢闀挎椂闂村唴涔熸病闂锛屼絾鏈€缁堜細鍑哄鎬殑鏁呴殰锛屽洜涓鸿繍绠楀紑濮嬫孩鍑猴紝浜х敓浜嗗畬鍏ㄦ棤娉曢鏂欑殑鍊笺€?/p>
涓轰簡瑙e喅杩欎釜闂锛孞ava 8涓篗ath绫绘坊鍔犱簡鍑犱釜鏂扮殑鈥滅簿纭瀷鈥濇柟娉曪紝浠ヤ究淇濇姢閲嶈鐨勪唬鐮佷笉鍙楁孩鍑虹殑褰卞搷锛屽畠鐨勫仛娉曟槸褰撹繍绠楄秴杩囧畠鐨勭簿搴﹁寖鍥寸殑鏃跺€欙紝鎶涘嚭涓€涓湭妫€鏌ョ殑ArithmeticException寮傚父銆?/p>
int safeC = Math.multiplyExact(bigA, bigB); // 濡傛灉缁撴灉瓒呭嚭+-2^31锛屽氨浼氭姏鍑篈rithmeticException寮傚父
鍞竴涓嶅ソ鐨勫湴鏂瑰氨鏄綘蹇呴』鑷繁鎵惧嚭鍙兘浜х敓婧㈠嚭鐨勪唬鐮併€傛棤璁哄浣曪紝娌℃湁浠€涔堣嚜鍔ㄧ殑瑙e喅鏂规銆備絾鎴戣寰楁湁杩欎簺鎺ュ彛鎬绘瘮娌℃湁濂姐€?/p>
瀹夊叏鐨勯殢鏈烘暟鍙戠敓鍣?/h2>
鍦ㄨ繃鍘诲嚑骞翠腑Java涓€鐩村洜涓哄畨鍏ㄦ紡娲炶€岄ケ鍙楄療鐥呫€傛棤璁烘槸鍚﹀悎鐞嗭紝Java宸茬粡鍋氫簡澶ч噺宸ヤ綔鏉ュ姞寮鸿櫄鎷熸満鍜屾鏋跺眰锛屼娇涔嬪厤鍙楁敾鍑汇€傚鏋滈殢鏈烘暟鏉ユ簮浜庨殢鏈烘€т笉楂樼殑绉嶅瓙锛岄偅涔堥偅浜涚敤闅忔満鏁版潵浜х敓瀵嗛挜鎴栬€呮暎鍒楁晱鎰熶俊鎭殑绯荤粺灏辨洿鏄撳彈鏀诲嚮銆?/p>
鍒扮洰鍓嶄负姝紝闅忔満鏁板彂鐢熺畻娉曠敱寮€鍙戜汉鍛樻潵鍐冲畾銆備絾闂鏄紝濡傛灉浣犳兂瑕佺殑绠楁硶渚濊禆浜庣壒瀹氱殑纭欢銆佹搷浣滅郴缁熴€佽櫄鎷熸満锛岄偅浣犲氨涓嶄竴瀹氳兘瀹炵幇瀹冦€傝繖绉嶆儏鍐典笅锛屽簲鐢ㄧ▼搴忓€惧悜浜庝娇鐢ㄦ洿寮辩殑榛樿鍙戠敓鍣紝杩欏氨浣夸粬浠毚闇插湪鏇村ぇ鐨勯闄╀笅浜嗐€?/p>
Java 8娣诲姞浜嗕竴涓柊鐨勬柟娉曞彨SecureRandom.getInstanceStrong()锛屽畠鐨勭洰鏍囨槸璁╄櫄鎷熸満涓轰綘閫夋嫨涓€涓畨鍏ㄧ殑闅忔満鏁板彂鐢熷櫒銆傚鏋滀綘 鐨勪唬鐮佹棤娉曞畬鍏ㄦ帉鎺ф搷浣滅郴缁熴€佺‖浠躲€佽櫄鎷熸満锛堝鏋滀綘鐨勭▼搴忛儴缃插埌浜戞垨鑰匬aaS涓婏紝杩欐槸寰堝父瑙佺殑锛夛紝鎴戝缓璁綘璁ょ湡鑰冭檻涓€涓嬩娇鐢ㄨ繖涓帴鍙c€?/p>
鍙€夊紩鐢?/h2>
绌烘寚閽堝氨鍍忊€滆涪鍒拌剼瓒锯€濅竴鏍封€斺€斾粠浣犲浼氳蛋璺紑濮嬪氨浼撮殢鐫€浣狅紝鏃犺鐜板湪浣犳湁澶氳仾鏄庘€斺€斾綘杩樻槸浼氱姱杩欎釜閿欍€備负浜嗗府鍔╄В鍐宠繖涓€侀棶棰橈紝Java 8寮曞叆浜嗕竴涓柊妯℃澘鍙玂ptional<T>銆?/p>
杩欎釜妯℃澘鏄粠Scala鍜孒ashkell鍊熼壌鏉ョ殑锛岀敤浜庢槑纭0鏄庝紶缁欏嚱鏁版垨鍑芥暟杩斿洖鐨勫紩鐢ㄦ湁鍙兘鏄┖鐨勩€傛湁浜嗗畠锛岃繃搴︿緷璧栨棫鏂囨。鎴栬€呯湅杩囩殑浠g爜缁忓父鍙樺姩鐨勪汉锛屽氨涓嶉渶瑕佸幓鐚滄祴鏌愪釜寮曠敤鏄惁鍙兘涓虹┖銆?/p>
Optional<User> tryFindUser(int userID) {
鎴?/p>
void processUser(User user, Optional<Cart> shoppingCart) {
Optional妯℃澘鏈変竴濂楀嚱鏁帮紝浣垮緱閲囨牱瀹冩洿鏂逛究锛屾瘮濡俰sPresent()鐢ㄦ潵妫€鏌ヨ繖涓€兼槸涓嶆槸闈炵┖锛屾垨鑰卛fPresent()浣犲彲浠ヤ紶閫?涓€涓狶ambda鍑芥暟杩囧幓锛屽鏋渋sPresent()杩斿洖true锛岃繖涓狶ambda鍑芥暟灏变細琚墽琛屻€備笉濂界殑鍦版柟灏辫窡Java 8鐨勬柊鏃ユ湡鎺ュ彛涓€鏍凤紝绛夎繖绉嶆ā寮忛€愭笎娴佽锛屾笚閫忓埌鎴戜滑浣跨敤鐨勫簱涓拰鏃ュ父璁捐涓紝闇€瑕佹椂闂村拰宸ヤ綔閲忋€?/p>
鐢ㄦ柊鐨凩ambda璇硶鎵撳嵃Optional鍊硷細
value.ifPresent(System.out::print);