java家居 finished_java 多線程踩過的坑

多線程踩坑記錄:

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執行結果會跟同步方法相似。就失去了多線程的意義

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值