多線程踩坑記錄:
1、多線程切記不可以同時操作同一個原子數據。解釋:存在一個條數據庫A數據,不可以在2個或2個以上的線程中同時操作A數據。會引發重復操作。
2、多線程操作方法不要加synchronized同步關鍵字,這失去了多線程的意義。解釋:會是多線程按照同步線程執行。
3、調用第三方接口時盡量不要使用多線程。解釋:因為你不知道第三方接口是否針對高並發作了處理。如果第三方接口沒有針對高並發作處理,自己寫的多線程邏輯也沒有處理好,會導致重復操作成功。后果很難處理。
總結:
作為一只菜鳥遇到過的問題。給自己提醒下。
處理一批數據的多線程方法:
使用同步線程獲取批量數據,在邏輯上將這批數據分成不同部分,每一部分使用多線程處理。這樣可以避免多個線程同時操作統一個數據。
多線程的實例synchronized對比:
線程執行方法:
importthreads.TaskRunnable;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classThreadsMain {public static voidmain(String[] args) {//創建線程池對象 參數5,代表有5個線程的線程池
ExecutorService service = Executors.newFixedThreadPool(5);//創建Runnable線程任務對象
TaskRunnable task = newTaskRunnable();//從線程池中獲取線程對象
service.submit(task);
System.out.println("----------------------");//再獲取一個線程對象
service.submit(task);//關閉線程池
service.shutdown();
}
}
帶有synchronized的執行方法:
public class TaskRunnable implementsRunnable{
@Overridepublic synchronized voidrun() {for (int i = 0; i < 10; i++) {try{
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("自定義線程任務在執行"+i);
}
}
}
執行結果:
----------------------
自定義線程任務在執行0
自定義線程任務在執行1
自定義線程任務在執行2
自定義線程任務在執行3
自定義線程任務在執行4
自定義線程任務在執行5
自定義線程任務在執行6
自定義線程任務在執行7
自定義線程任務在執行8
自定義線程任務在執行9
自定義線程任務在執行0
自定義線程任務在執行1
自定義線程任務在執行2
自定義線程任務在執行3
自定義線程任務在執行4
自定義線程任務在執行5
自定義線程任務在執行6
自定義線程任務在執行7
自定義線程任務在執行8
自定義線程任務在執行9
Process finished with exit code 0
沒有synchronized的執行方法:
public class TaskRunnable implementsRunnable{
@Overridepublic voidrun() {for (int i = 0; i < 10; i++) {try{
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("自定義線程任務在執行"+i);
}
}
}
執行結果:
----------------------
自定義線程任務在執行0
自定義線程任務在執行0
自定義線程任務在執行1
自定義線程任務在執行1
自定義線程任務在執行2
自定義線程任務在執行2
自定義線程任務在執行3
自定義線程任務在執行3
自定義線程任務在執行4
自定義線程任務在執行4
自定義線程任務在執行5
自定義線程任務在執行5
自定義線程任務在執行6
自定義線程任務在執行6
自定義線程任務在執行7
自定義線程任務在執行7
自定義線程任務在執行8
自定義線程任務在執行8
自定義線程任務在執行9
自定義線程任務在執行9
Process finished with exit code 0
對比結論:
加入synchronized執行結果會跟同步方法相似。就失去了多線程的意義