1.認識ORM ORM ( Object Relation Mapping )是對象/關係映射。它提供了概念性的、易於理解的數據模型,將資料庫中的表和記憶體中的對象建立映射關係。它是隨著面向對象的軟體開發方法的發展而產生的,面向對象的開發方法依然是當前主流的開發方法。 對象和關係型數據是業務實體的兩種 ...
轉自:
http://www.java265.com/JavaCourse/202204/3182.html
下文筆者講述java中避免死鎖的方法分享,如下所示避免死鎖的方法: 不使用synchronized這個顯式的鎖,而採用信號量控制資源,可被多少線程訪問 當設置資源只可被一個線程訪問時,則此時為鎖住狀態, 信號量可設置獲取的超時時間, 對無法成功獲取,可進行重覆嘗試,或指定嘗試次數後,也可立即退出例:
使用信號量控制死鎖
package com.java265.other; import java.util.Date; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class Test16 { public static String obj1 = "java265.com-1"; public static final Semaphore a1 = new Semaphore(1); public static String obj2 = "java265.com-2"; public static final Semaphore a2 = new Semaphore(1); public static void main(String[] args) { LockAa a = new LockAa(); new Thread(a).start(); LockBb b = new LockBb(); new Thread(b).start(); } } class LockAa implements Runnable { public void run() { try { System.out.println(new Date().toString() + " LockA 開始執行"); while (true) { if (Test16.a1.tryAcquire(1, TimeUnit.SECONDS)) { System.out.println(new Date().toString() + " LockA 鎖住 obj1"); if (Test16.a2.tryAcquire(1, TimeUnit.SECONDS)) { System.out.println(new Date().toString() + " LockA 鎖住 obj2"); Thread.sleep(60 * 1000); // do something } else { System.out.println(new Date().toString() + "LockA 鎖 obj2 失敗"); } } else { System.out.println(new Date().toString() + "LockA 鎖 obj1 失敗"); } Test16.a1.release(); // 釋放 Test16.a2.release(); Thread.sleep(1000); // 馬上進行嘗試,現實情況下do something是不確定的 } } catch (Exception e) { e.printStackTrace(); } } } class LockBb implements Runnable { public void run() { try { System.out.println("java265.com " + new Date().toString() + " LockB 開始執行"); while (true) { if (Test16.a2.tryAcquire(1, TimeUnit.SECONDS)) { System.out.println(new Date().toString() + " LockB 鎖住 obj2"); if (Test16.a1.tryAcquire(1, TimeUnit.SECONDS)) { System.out.println(new Date().toString() + " LockB 鎖住 obj1"); Thread.sleep(60 * 1000); // do something } else { System.out.println(new Date().toString() + "LockB 鎖 obj1 失敗"); } } else { System.out.println(new Date().toString() + "LockB 鎖 obj2 失敗"); } Test16.a1.release(); // 釋放 Test16.a2.release(); Thread.sleep(10 * 1000); // 這裡只是為了演示,所以tryAcquire只用1秒,而且B要給A讓出能執行的時間,否則兩個永遠是死鎖 } } catch (Exception e) { e.printStackTrace(); } } } -----運行以上代碼,將輸出以下信息----- Thu Apr 28 23:01:32 CST 2022 LockA 開始執行 java265.com Thu Apr 28 23:01:32 CST 2022 LockB 開始執行 Thu Apr 28 23:01:32 CST 2022 LockA 鎖住 obj1 Thu Apr 28 23:01:32 CST 2022 LockB 鎖住 obj2 Thu Apr 28 23:01:33 CST 2022LockB 鎖 obj1 失敗 Thu Apr 28 23:01:33 CST 2022LockA 鎖 obj2 失敗 Thu Apr 28 23:01:34 CST 2022 LockA 鎖住 obj1 Thu Apr 28 23:01:34 CST 2022 LockA 鎖住 obj2 Thu Apr 28 23:01:43 CST 2022 LockB 鎖住 obj2 Thu Apr 28 23:01:43 CST 2022 LockB 鎖住 obj1 Thu Apr 28 23:02:35 CST 2022 LockA 鎖住 obj1 Thu Apr 28 23:02:35 CST 2022 LockA 鎖住 obj2