JAVA程序设计,多线程且避免死锁 Java开发中 怎样预防和处理死锁问题
JAVA\u4e2d\u5982\u4f55\u53bb\u907f\u514d\u591a\u7ebf\u7a0b\u4ea7\u751f\u7684\u6b7b\u9501Java\u7ebf\u7a0b\u6b7b\u9501\u9700\u8981\u5982\u4f55\u89e3\u51b3\uff0c\u8fd9\u4e2a\u95ee\u9898\u4e00\u76f4\u5728\u6211\u4eec\u4e0d\u65ad\u7684\u4f7f\u7528\u4e2d\u9700\u8981\u53ea\u6709\u4e0d\u65ad\u7684\u5173\u952e\u3002\u4e0d\u5e78\u7684\u662f\uff0c\u4f7f\u7528\u4e0a\u9501\u4f1a\u5e26\u6765\u5176\u4ed6\u95ee\u9898\u3002\u8ba9\u6211\u4eec\u6765\u770b\u4e00\u4e9b\u5e38\u89c1\u95ee\u9898\u4ee5\u53ca\u76f8\u5e94\u7684\u89e3\u51b3\u65b9\u6cd5\uff1a Java\u7ebf\u7a0b\u6b7b\u9501 Java\u7ebf\u7a0b\u6b7b\u9501\u662f\u4e00\u4e2a\u7ecf\u5178\u7684\u591a\u7ebf\u7a0b\u95ee\u9898\uff0c\u56e0\u4e3a\u4e0d\u540c\u7684\u7ebf\u7a0b\u90fd\u5728\u7b49\u5f85\u90a3\u4e9b\u6839\u672c\u4e0d\u53ef\u80fd\u88ab\u91ca\u653e\u7684\u9501\uff0c\u4ece\u800c\u5bfc\u81f4\u6240\u6709\u7684\u5de5\u4f5c\u90fd\u65e0\u6cd5\u5b8c\u6210\u3002\u5047\u8bbe\u6709\u4e24\u4e2a\u7ebf\u7a0b\uff0c\u5206\u522b\u4ee3\u8868\u4e24\u4e2a\u9965\u997f\u7684\u4eba\uff0c\u4ed6\u4eec\u5fc5\u987b\u5171\u4eab\u5200\u53c9\u5e76\u8f6e\u6d41\u5403\u996d\u3002\u4ed6\u4eec\u90fd\u9700\u8981\u83b7\u5f97\u4e24\u4e2a\u9501\uff1a\u5171\u4eab\u5200\u548c\u5171\u4eab\u53c9\u7684\u9501\u3002 \u5047\u5982\u7ebf\u7a0b \u201cA\u201d\u83b7\u5f97\u4e86\u5200\uff0c\u800c\u7ebf\u7a0b\u201cB\u201d\u83b7\u5f97\u4e86\u53c9\u3002\u7ebf\u7a0b\u201cA\u201d\u5c31\u4f1a\u8fdb\u5165\u963b\u585e\u72b6\u6001\u6765\u7b49\u5f85\u83b7\u5f97\u53c9\uff0c\u800c\u7ebf\u7a0b\u201cB\u201d\u5219\u963b\u585e\u6765\u7b49\u5f85\u201cA\u201d\u6240\u62e5\u6709\u7684\u5200\u3002\u8fd9\u53ea\u662f\u4eba\u4e3a\u8bbe\u8ba1\u7684\u4f8b\u5b50\uff0c\u4f46\u5c3d\u7ba1\u5728\u8fd0\u884c\u65f6\u5f88\u96be\u63a2\u6d4b\u5230\uff0c\u8fd9\u7c7b\u60c5\u51b5\u5374\u65f6\u5e38\u53d1\u751f\u3002\u867d\u7136\u8981\u63a2\u6d4b\u6216\u63a8\u6572\u5404\u79cd\u60c5\u51b5\u662f\u975e\u5e38\u56f0\u96be\u7684\uff0c\u4f46\u53ea\u8981\u6309\u7167\u4e0b\u9762\u51e0\u6761\u89c4\u5219\u53bb\u8bbe\u8ba1\u7cfb\u7edf\uff0c\u5c31\u80fd\u591f\u907f\u514dJava\u7ebf\u7a0b\u6b7b\u9501\u95ee\u9898\uff1a \u8ba9\u6240\u6709\u7684\u7ebf\u7a0b\u6309\u7167\u540c\u6837\u7684\u987a\u5e8f\u83b7\u5f97\u4e00\u7ec4\u9501\u3002\u8fd9\u79cd\u65b9\u6cd5\u6d88\u9664\u4e86 X \u548c Y \u7684\u62e5\u6709\u8005\u5206\u522b\u7b49\u5f85\u5bf9\u65b9\u7684\u8d44\u6e90\u7684\u95ee\u9898\u3002 \u5c06\u591a\u4e2a\u9501\u7ec4\u6210\u4e00\u7ec4\u5e76\u653e\u5230\u540c\u4e00\u4e2a\u9501\u4e0b\u3002\u524d\u9762Java\u7ebf\u7a0b\u6b7b\u9501\u7684\u4f8b\u5b50\u4e2d\uff0c\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a\u94f6\u5668\u5bf9\u8c61\u7684\u9501\u3002\u4e8e\u662f\u5728\u83b7\u5f97\u5200\u6216\u53c9\u4e4b\u524d\u90fd\u5fc5\u987b\u83b7\u5f97\u8fd9\u4e2a\u94f6\u5668\u7684\u9501\u3002 \u5c06\u90a3\u4e9b\u4e0d\u4f1a\u963b\u585e\u7684\u53ef\u83b7\u5f97\u8d44\u6e90\u7528\u53d8\u91cf\u6807\u5fd7\u51fa\u6765\u3002\u5f53\u67d0\u4e2a\u7ebf\u7a0b\u83b7\u5f97\u94f6\u5668\u5bf9\u8c61\u7684\u9501\u65f6\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7\u68c0\u67e5\u53d8\u91cf\u6765\u5224\u65ad\u662f\u5426\u6574\u4e2a\u94f6\u5668\u96c6\u5408\u4e2d\u7684\u5bf9\u8c61\u9501\u90fd\u53ef\u83b7\u5f97\u3002\u5982\u679c\u662f\uff0c\u5b83\u5c31\u53ef\u4ee5\u83b7\u5f97\u76f8\u5173\u7684\u9501\uff0c\u5426\u5219\uff0c\u5c31\u8981\u91ca\u653e\u6389\u94f6\u5668\u8fd9\u4e2a\u9501\u5e76\u7a0d\u540e\u518d\u5c1d\u8bd5\u3002 \u6700\u91cd\u8981\u7684\u662f\uff0c\u5728\u7f16\u5199\u4ee3\u7801\u524d\u8ba4\u771f\u4ed4\u7ec6\u5730\u8bbe\u8ba1\u6574\u4e2a\u7cfb\u7edf\u3002\u591a\u7ebf\u7a0b\u662f\u56f0\u96be\u7684\uff0c\u5728\u5f00\u59cb\u7f16\u7a0b\u4e4b\u524d\u8be6\u7ec6\u8bbe\u8ba1\u7cfb\u7edf\u80fd\u591f\u5e2e\u52a9\u4f60\u907f\u514d\u96be\u4ee5\u53d1\u73b0Java\u7ebf\u7a0b\u6b7b\u9501\u7684\u95ee\u9898\u3002 Volatile \u53d8\u91cf\uff0cvolatile \u5173\u952e\u5b57\u662f Java \u8bed\u8a00\u4e3a\u4f18\u5316\u7f16\u8bd1\u5668\u8bbe\u8ba1\u7684\u3002\u4ee5\u4e0b\u9762\u7684\u4ee3\u7801\u4e3a\u4f8b\uff1a 1.class VolatileTest {
2.public void foo() {
3.boolean flag = false;
4.if(flag) {
5.//this could happen
6.}
7.}
8.} \u4e00\u4e2a\u4f18\u5316\u7684\u7f16\u8bd1\u5668\u53ef\u80fd\u4f1a\u5224\u65ad\u51faif\u90e8\u5206\u7684\u8bed\u53e5\u6c38\u8fdc\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u5c31\u6839\u672c\u4e0d\u4f1a\u7f16\u8bd1\u8fd9\u90e8\u5206\u7684\u4ee3\u7801\u3002\u5982\u679c\u8fd9\u4e2a\u7c7b\u88ab\u591a\u7ebf\u7a0b\u8bbf\u95ee\uff0c flag\u88ab\u524d\u9762\u67d0\u4e2a\u7ebf\u7a0b\u8bbe\u7f6e\u4e4b\u540e\uff0c\u5728\u5b83\u88abif\u8bed\u53e5\u6d4b\u8bd5\u4e4b\u524d\uff0c\u53ef\u4ee5\u88ab\u5176\u4ed6\u7ebf\u7a0b\u91cd\u65b0\u8bbe\u7f6e\u3002\u7528volatile\u5173\u952e\u5b57\u6765\u58f0\u660e\u53d8\u91cf\uff0c\u5c31\u53ef\u4ee5\u544a\u8bc9\u7f16\u8bd1\u5668\u5728\u7f16\u8bd1\u7684\u65f6\u5019\uff0c\u4e0d\u9700\u8981\u901a\u8fc7\u9884\u6d4b\u53d8\u91cf\u503c\u6765\u4f18\u5316\u8fd9\u90e8\u5206\u7684\u4ee3\u7801\u3002 \u65e0\u6cd5\u8bbf\u95ee\u7684Java\u7ebf\u7a0b\u6b7b\u9501\u6709\u65f6\u5019\u867d\u7136\u83b7\u53d6\u5bf9\u8c61\u9501\u6ca1\u6709\u95ee\u9898\uff0c\u7ebf\u7a0b\u4f9d\u7136\u6709\u53ef\u80fd\u8fdb\u5165\u963b\u585e\u72b6\u6001\u3002\u5728 Java \u7f16\u7a0b\u4e2dIO\u5c31\u662f\u8fd9\u7c7b\u95ee\u9898\u6700\u597d\u7684\u4f8b\u5b50\u3002\u5f53\u7ebf\u7a0b\u56e0\u4e3a\u5bf9\u8c61\u5185\u7684IO\u8c03\u7528\u800c\u963b\u585e\u65f6\uff0c\u6b64\u5bf9\u8c61\u5e94\u5f53\u4ecd\u80fd\u88ab\u5176\u4ed6\u7ebf\u7a0b\u8bbf\u95ee\u3002\u8be5\u5bf9\u8c61\u901a\u5e38\u6709\u8d23\u4efb\u53d6\u6d88\u8fd9\u4e2a\u963b\u585e\u7684IO\u64cd\u4f5c\u3002\u9020\u6210\u963b\u585e\u8c03\u7528\u7684\u7ebf\u7a0b\u5e38\u5e38\u4f1a\u4ee4\u540c\u6b65\u4efb\u52a1\u5931\u8d25\u3002\u5982\u679c\u8be5\u5bf9\u8c61\u7684\u5176\u4ed6\u65b9\u6cd5\u4e5f\u662f\u540c\u6b65\u7684\uff0c\u5f53\u7ebf\u7a0b\u88ab\u963b\u585e\u65f6\uff0c\u6b64\u5bf9\u8c61\u4e5f\u5c31\u76f8\u5f53\u4e8e\u88ab\u51b7\u51bb\u4f4f\u4e86\u3002 \u5176\u4ed6\u7684\u7ebf\u7a0b\u7531\u4e8e\u4e0d\u80fd\u83b7\u5f97\u5bf9\u8c61\u7684Java\u7ebf\u7a0b\u6b7b\u9501\uff0c\u5c31\u4e0d\u80fd\u7ed9\u6b64\u5bf9\u8c61\u53d1\u6d88\u606f(\u4f8b\u5982\uff0c\u53d6\u6d88 IO \u64cd\u4f5c)\u3002\u5fc5\u987b\u786e\u4fdd\u4e0d\u5728\u540c\u6b65\u4ee3\u7801\u4e2d\u5305\u542b\u90a3\u4e9b\u963b\u585e\u8c03\u7528\uff0c\u6216\u786e\u8ba4\u5728\u4e00\u4e2a\u7528\u540c\u6b65\u963b\u585e\u4ee3\u7801\u7684\u5bf9\u8c61\u4e2d\u5b58\u5728\u975e\u540c\u6b65\u65b9\u6cd5\u3002\u5c3d\u7ba1\u8fd9\u79cd\u65b9\u6cd5\u9700\u8981\u82b1\u8d39\u4e00\u4e9b\u6ce8\u610f\u529b\u6765\u4fdd\u8bc1\u7ed3\u679c\u4ee3\u7801\u5b89\u5168\u8fd0\u884c\uff0c\u4f46\u5b83\u5141\u8bb8\u5728\u62e5\u6709\u5bf9\u8c61\u7684\u7ebf\u7a0b\u53d1\u751f\u963b\u585e\u540e\uff0c\u8be5\u5bf9\u8c61\u4ecd\u80fd\u591f\u54cd\u5e94\u5176\u4ed6\u7ebf\u7a0b\u3002 \u7f16\u8f91\u63a8\u8350\uff1a 1. Java\u591a\u7ebf\u7a0b\u4f18\u5316\u4e4b\u504f\u5411\u9501\u539f\u7406\u5206\u6790 2. Java\u591a\u7ebf\u7a0b\u5b9e\u73b0\u5f02\u6b65\u8c03\u7528\u7684\u65b9\u6cd5 3. \u4f7f\u7528Java\u591a\u7ebf\u7a0b\u673a\u5236\u5b9e\u73b0\u4e0b\u8f7d\u7684\u65b9\u6cd5\u4ecb\u7ecd
\u5f53\u591a\u4e2a\u7ebf\u7a0b\u9700\u8981\u76f8\u540c\u7684\u4e00\u4e9b\u9501\uff0c\u4f46\u662f\u6309\u7167\u4e0d\u540c\u7684\u987a\u5e8f\u52a0\u9501\uff0c\u6b7b\u9501\u5c31\u5f88\u5bb9\u6613\u53d1\u751f\u3002
\u5982\u679c\u80fd\u786e\u4fdd\u6240\u6709\u7684\u7ebf\u7a0b\u90fd\u662f\u6309\u7167\u76f8\u540c\u7684\u987a\u5e8f\u83b7\u5f97\u9501\uff0c\u90a3\u4e48\u6b7b\u9501\u5c31\u4e0d\u4f1a\u53d1\u751f\u3002\u770b\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50\uff1a
Thread 1:
lock A
lock B
Thread 2:
wait for A
lock C (when A locked)
Thread 3:
wait for A
wait for B
wait for C
绛旓細濡傛灉鍏佽姝婚攣寮傚父浼犳挱鍒板垵濮嬪寲璇ヤ簨鍔$殑浠g爜灞備箣澶栵紝鍒欒浠g爜灞傚彲浠ュ惎鍔ㄤ竴涓柊浜嬪姟骞堕噸鍋氬厛鍓嶆墍鏈夊伐浣溿傚綋鍑虹幇闂灏遍噸璇曪紝鐢变簬鏁版嵁搴撳彲浠ヨ嚜鐢卞湴鑾峰彇閿侊紝鎵浠ュ嚑涔庝笉鍙兘淇濊瘉涓や釜鎴栦袱涓互涓婄殑绾跨▼涓嶅彂鐢熸暟鎹簱姝婚攣銆傛鏂规硶鑷冲皯鑳戒繚璇佸湪鍑虹幇鏌愪簺鏁版嵁搴撴閿佹儏鍐垫椂锛屽簲鐢绋嬪簭鑳芥甯歌繍琛屻(2)璧勬簮姹犺楀敖姝婚攣瀹㈡埛绔...
绛旓細涓銆佺悊瑙e绾跨▼ 澶氱嚎绋嬫満鍒跺厑璁绋嬪簭涓涓寚浠ゆ祦骞跺彂鎵ц锛屾瘡涓寚浠ゆ祦绉颁负涓涓绾跨▼锛绾跨▼闂寸浉浜掔嫭绔嬨傜嚎绋嬫槸杞婚噺绾ц繘绋嬶紝鎷ユ湁鐙珛鐨勬墽琛屾帶鍒讹紝鐢辨搷浣滅郴缁熻皟搴︼紝浣嗗叡浜墍灞炶繘绋嬬殑瀛樺偍绌洪棿銆傚绾跨▼鎵ц鏄昏緫涓婄殑骞跺彂锛屼笉涓瀹氭槸鐗╃悊涓婄殑骞跺彂銆備簩銆佸湪Java涓瀹炵幇澶氱嚎绋 Java閫氳繃Thread绫绘敮鎸澶氱嚎绋嬬紪绋銆傚彲浠ラ氳繃...
绛旓細澶氱嚎绋鍜屼紶缁熺殑鍗曠嚎绋嬪湪绋嬪簭璁捐涓婃渶澶х殑鍖哄埆鍦ㄤ簬,鐢变簬鍚勪釜绾跨▼鐨勬帶鍒舵祦褰兼鐙珛,浣垮緱鍚勪釜绾跨▼涔嬮棿鐨勪唬鐮佹槸涔卞簭鎵ц鐨,鐢辨甯︽潵鐨勭嚎绋嬭皟搴,鍚屾绛夐棶棰,灏嗗湪浠ュ悗鎺㈣銆備簩銆佸湪Java涓瀹炵幇澶氱嚎绋嬫垜浠笉濡ㄨ鎯,涓轰簡鍒涘缓涓涓柊鐨勭嚎绋,鎴戜滑闇瑕佸仛浜涗粈涔?寰堟樉鐒,鎴戜滑蹇呴』鎸囨槑杩欎釜绾跨▼鎵瑕佹墽琛岀殑浠g爜,鑰岃繖灏辨槸鍦↗ava涓疄鐜板...
绛旓細鏈閲嶈鐨勬槸锛屽湪缂栧啓浠g爜鍓嶈鐪熶粩缁嗗湴璁捐鏁翠釜绯荤粺銆澶氱嚎绋鏄洶闅剧殑锛屽湪寮濮缂栫▼涔嬪墠璇︾粏璁捐绯荤粺鑳藉甯姪浣閬垮厤闅句互鍙戠幇Java绾跨▼姝婚攣鐨勯棶棰樸 Volatile 鍙橀噺锛寁olatile 鍏抽敭瀛楁槸 Java 璇█涓轰紭鍖栫紪璇戝櫒璁捐鐨勩備互涓嬮潰鐨勪唬鐮佷负渚嬶細 1.class VolatileTest { 2.public void foo() { 3.boolean flag = false...
绛旓細寤鸿浣跨敤鐨勬柟娉曞湪銆奧hy are Thread.stop, Thread.suspend and Thread.resume Deprecated? 銆嬩腑锛屽缓璁娇鐢ㄥ涓嬬殑鏂规硶鏉ュ仠姝绾跨▼锛歱rivate volatile Thread blinker;public void stop() { blinker = null;} public void run() { Thread thisThread = Thread.currentThread();while (blinker == thisThread...
绛旓細澶氱嚎绋鏄Java璇█鐨勪竴澶х壒鎬 澶氱嚎绋嬪氨鏄悓鏃跺瓨鍦∟涓墽琛屼綋 鎸夊嚑鏉′笉鍚岀殑鎵ц绾跨储鍏卞悓宸ヤ綔鐨勬儏鍐 绋嬪簭 杩涚▼ 绾跨▼ 鍙互浠庝笉鍚岀殑瑙掑害鍘荤悊瑙 绋嬪簭灏辨槸涓娈甸潤鎬佺殑浠g爜 鍙互鐞嗚В鎴愪竴缁勮绠楁満鍛戒护鐨勯泦鍚 杩涜灏辨槸杩欎釜绋嬪簭涓娆″姩鎬佺殑鎵ц杩囩▼ 浠庝唬鐮佺殑鍔犺浇鍒版墽琛屽畬姣曠殑涓涓繃绋 绾跨▼鏄竴涓瘮杩涚▼灏忕殑鍗曚綅 涓涓...
绛旓細鎴戜滑鐭ラ亾Java鏄潰鍚戝璞$殑绋嬪簭璇█ 鐢↗ava杩涜绋嬪簭璁捐灏辨槸璁捐鍜屼娇鐢ㄧ被 Java涓烘垜浠彁渚涗簡绾跨▼绫籘hread鏉ュ垱寤虹嚎绋 鍒涘缓绾跨▼涓庡垱寤烘櫘閫氱殑绫荤殑瀵硅薄鐨勬搷浣滄槸涓鏍风殑 鑰岀嚎绋嬪氨鏄疶hread绫绘垨鍏跺瓙绫荤殑瀹炰緥瀵硅薄 涓嬮潰鏄竴涓垱寤哄惎鍔ㄤ竴涓嚎绋嬬殑璇彞 Thread thread =new Thread(); file://澹版槑涓涓璞″疄渚 鍗冲垱寤轰竴涓嚎绋 ...
绛旓細2.2.鍐欎竴鑷存 Java 鎻愪緵浜嗕笁绉嶆柟寮忔潵淇濊瘉璇诲啓涓鑷存э紝鍒嗗埆鏄簰鏂ラ攣銆佽嚜鏃嬮攣銆绾跨▼闅旂銆2.2.1.浜掓枼閿 浜掓枼閿佸彧鏄竴涓攣姒傚康锛屽湪鍏朵粬鍦烘櫙涔熷彨鍋氱嫭鍗犻攣銆佹偛瑙傞攣绛夛紝鍏跺疄灏辨槸涓涓剰鎬濄傚畠鏄寚绾跨▼涔嬮棿鏄簰鏂ョ殑锛屾煇涓涓嚎绋嬭幏鍙栦簡鏌愪釜璧勬簮鐨勯攣锛岄偅涔堝叾浠栫嚎绋嬪氨鍙兘鐫$湢绛夊緟銆傚湪 Java 涓浜掓枼閿佺殑瀹炵幇...
绛旓細涓轰簡閬垮厤闃诲锛屽崟绾跨▼搴旂敤绋嬪簭蹇呴』浣跨敤闈為樆濉濱/O,杩欐牱鐨処/O澶嶆潅鎬ц繙杩滈珮浜庡悓姝/O锛屽苟涓斿鏄撳嚭閿欍4銆澶氱嚎绋鐨勭己鐐癸細绾跨▼瀹夊叏锛氱敱浜庣粺涓杩涚▼涓嬬殑澶氫釜绾跨▼鏄叡浜悓鏍风殑鍦板潃绌洪棿鍜屾暟鎹殑锛屽張鐢变簬绾跨▼鎵ц椤哄簭鐨勪笉鍙鐭ユэ紝涓涓嚎绋嬪彲鑳戒細淇敼鍏朵粬绾跨▼姝e湪浣跨敤鐨勫彉閲忥紝杩欎竴鏂归潰鏄粰鏁版嵁鍏变韩甯︽潵浜嗕究鍒╋紱鍙...
绛旓細public static int ticketSum=100;public static boolean state=true;public static int cunt=0;/ param args / public static void main(String[] args) { TicketSellerMachine mechineOfGuangZhou=new TicketSellerMachine("GuangZhou");TicketSellerMachine mechineOfShangHai=new TicketSellerMachine("...