电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java中的多線程一定就快嗎?

瀏覽:87日期:2022-08-25 11:05:53

并發編程與多線程編程

要了解并發編程,首先要懂得與并行這個概念進行區分。并行是指兩個事件同時進行,并發是CPU切換速度快,看起來像是每個任務同時進行一樣。多線程是實現并發編程的一種方式,假設一個場景,在廣州地鐵高峰時段,一群人涌進地鐵里,在不同的閘機口刷卡進去。在這個場景里,進地鐵就是任務,每個人可以看出是并發的,而多個刷卡閘機口就是多線程。

  并發編程的本質目的是為了充分利用CPU,讓程序運行得更快。然而,并不是啟動更多的線程就能讓程序最大限度地并發執行。在進行并發編程時,如果希望通過多線程執行任務讓程序運行得更快,會面臨非常多的挑戰。比如上下文切換的問題、死鎖的問題,以及受限于硬件和軟件的資源限制問題,下面就來嘮嗑嘮嗑這些因素。

上下文切換

原理分析

正如上面所言,并發與并行最大的區別就是,并發只是看起來像是并行。實際上是,CPU通過給每個線程分配時間來執行這個線程的程序,只是這個時間非常短,通常是幾十毫秒,我們根本無法觀察到變化,感覺它們都是同時執行的一樣。

  CPU通過時間片分配算法來循環執行任務,當前任務執行一個時間片后會切換到下一個任務。但是,在切換前會保存上一個任務的狀態,以便下次切換回這個任務時,可以再加載這個任務的狀態。所以任務從保存到再加載的過程就是一次上下文切換。因此,不難得知,上下文切換需要耗費不少時間。

  再來假設一個場景,一個人去火車站買票,買票的窗口有十來個那么多。買票的人并不知道哪個窗口可以買到票,只能挨個地問,最后終于在最后一個窗口買到了。這個場景,看似買票的過程很長,其實大部分時間都在切換窗口上,這也就是上下文切換的問題所在。因此,并非線程數多就一定執行得快,要選擇與任務相適應的線程數才是最佳方案。

測試代碼

package Concurrency;/** * @author RuiMing Lin * @date 2020-03-28 12:19 */public class Demo1 { public static void main(String[] args) { System.out.println('萬級循環:'); concurrency(10000); serial(10000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('十萬級循環:'); concurrency(100000); serial(100000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('百萬級循環:'); concurrency(1000000); serial(1000000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('千萬級循環:'); concurrency(10000000); serial(10000000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('億級循環:'); concurrency(100000000); serial(100000000); } private static void concurrency(long count){ // 開啟三個線程執行三個循環 long start = System.currentTimeMillis(); new Thread(new Runnable() { @Override public void run() {int a = 0;for (long i = 0; i < count; i++) { a++;} } }).start(); new Thread(new Runnable() { @Override public void run() {int b = 0;for (long i = 0; i < count; i++) { b++;} } }).start(); new Thread(new Runnable() { @Override public void run() {int c = 0;for (long i = 0; i < count; i++) { c++;} } }).start(); long end = System.currentTimeMillis(); long time = end - start; System.out.println('并行執行花費時間為:' + time + 'ms'); } private static void serial(long count){ // 三個循環順序執行 long start = System.currentTimeMillis(); int a = 0; int b = 0; int c = 0; for (int i = 0; i < count; i++) { a++; } for (int i = 0; i < count; i++) { b++; } for (int i = 0; i < count; i++) { c++; } long end = System.currentTimeMillis(); long time = end - start; System.out.println('串行執行花費時間為:' + time + 'ms'); }}

結果輸出:

萬級循環: 并行執行花費時間為:4ms 串行執行花費時間為:1ms

--------------------------華麗分隔符--------------------------------

十萬級循環: 并行執行花費時間為:1ms 串行執行花費時間為:4ms

--------------------------華麗分隔符--------------------------------

百萬級循環: 并行執行花費時間為:1ms 串行執行花費時間為:10ms

--------------------------華麗分隔符--------------------------------

千萬級循環: 并行執行花費時間為:1ms 串行執行花費時間為:36ms

--------------------------華麗分隔符--------------------------------

億級循環: 并行執行花費時間為:1ms 串行執行花費時間為:357ms

分析結果:

當數量級在萬級時,串行是比并發要快的,當數量級來到十萬以后,串行便顯得力不從心了。所以,可以認為當程序執行量不夠大時,是沒必要開啟多線程的。

如何減少上下文切換

減少上下文切換的方法有無鎖并發編程、CAS算法、使用最少線程和使用協程。

無鎖并發編程。多線程競爭鎖時,會引起上下文切換,所以多線程處理數據時,可以用一些辦法來避免使用鎖,如將數據的ID按照Hash算法取模分段,不同的線程處理不同段的數據。 CAS算法。Java的Atomic包使用CAS算法來更新數據,而不需要加鎖。 使用最少線程。避免創建不需要的線程,比如任務很少,但是創建了很多線程來處理,這樣會造成大量線程都處于等待狀態。 協程:在單線程里實現多任務的調度,并在單線程里維持多個任務間的切換。

死鎖

原理分析

 死鎖,是指多個線程在運行過程中因爭奪相同資源而造成的一種僵局,當進程處于這種僵持狀態時,它們都將無法再向前推進,此時程序就處于癱瘓狀態,無法執行。 通常情況下,是多個線程共同競爭同一把鎖對象,而其中一個線程獲得鎖之后發生異常等未來得及釋放鎖,導致其它線程一直在等待,無法運行。

測試代碼

package Concurrency;/** * @author RuiMing Lin * @date 2020-03-28 13:14 */public class Demo2 { private static String str1 = 'A'; private static String str2 = 'B'; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() {synchronized (str1){ System.out.println('第一個線程獲得str1'); try { Thread.currentThread().sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); } synchronized (str2){ System.out.println('第一個線程獲得str2'); }} } }).start(); new Thread(new Runnable() { @Override public void run() {synchronized (str2){ System.out.println('第二個線程獲得str2'); try { Thread.currentThread().sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); } synchronized (str1){ System.out.println('第二個線程獲得str1'); }} } }).start(); }}

結果輸出:

Java中的多線程一定就快嗎?

如何解決死鎖

避免一個線程同時獲取多個鎖。 避免一個線程在鎖內同時占用多個資源,盡量保證每個鎖只占用一個資源。 嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制。 對于數據庫鎖,加鎖和解鎖必須在一個數據庫連接里,否則會出現解鎖失敗的情況。

總結

并發程序并不是簡單的程序,編寫的時候應該嚴謹一些。復雜的代碼容易引起死鎖,因此,建議多使用JDK并發包提供的并發容器和工具類來解決并發問題。同時,也要注重新能上的問題,既要考慮到程序執行任務量,也要考慮CPU性能等等,不要一昧地增加線程數。

以上就是Java中的多線程一定就快嗎?的詳細內容,更多關于Java 多線程的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 杭州翻译公司_驾照翻译_专业人工翻译-杭州以琳翻译有限公司官网 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 北京租车牌|京牌指标租赁|小客车指标出租 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 变色龙云 - 打包app_原生app_在线制作平台_短链接_ip查询 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 万濠影像仪(万濠投影仪)百科-苏州林泽仪器 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 高压直流电源_特种变压器_变压器铁芯-希恩变压器定制厂家 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 商标转让-商标注册-商标查询-软著专利服务平台 - 赣江万网 |