日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

并發(fā)編程與多線程編程

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

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

上下文切換

原理分析

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

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

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

測試代碼

package Concurrency;/** * @author RuiMing Lin * @date 2020-03-28 12:19 */public class Demo1 { public static void main(String[] args) { System.out.println('萬級循環(huán):'); concurrency(10000); serial(10000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('十萬級循環(huán):'); concurrency(100000); serial(100000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('百萬級循環(huán):'); concurrency(1000000); serial(1000000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('千萬級循環(huán):'); concurrency(10000000); serial(10000000); System.out.println('--------------------------華麗分隔符--------------------------------'); System.out.println('億級循環(huán):'); concurrency(100000000); serial(100000000); } private static void concurrency(long count){ // 開啟三個線程執(zhí)行三個循環(huán) 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('并行執(zhí)行花費時間為:' + time + 'ms'); } private static void serial(long count){ // 三個循環(huán)順序執(zhí)行 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('串行執(zhí)行花費時間為:' + time + 'ms'); }}

結(jié)果輸出:

萬級循環(huán): 并行執(zhí)行花費時間為:4ms 串行執(zhí)行花費時間為:1ms

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

十萬級循環(huán): 并行執(zhí)行花費時間為:1ms 串行執(zhí)行花費時間為:4ms

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

百萬級循環(huán): 并行執(zhí)行花費時間為:1ms 串行執(zhí)行花費時間為:10ms

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

千萬級循環(huán): 并行執(zhí)行花費時間為:1ms 串行執(zhí)行花費時間為:36ms

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

億級循環(huán): 并行執(zhí)行花費時間為:1ms 串行執(zhí)行花費時間為:357ms

分析結(jié)果:

當(dāng)數(shù)量級在萬級時,串行是比并發(fā)要快的,當(dāng)數(shù)量級來到十萬以后,串行便顯得力不從心了。所以,可以認(rèn)為當(dāng)程序執(zhí)行量不夠大時,是沒必要開啟多線程的。

如何減少上下文切換

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

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

死鎖

原理分析

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

測試代碼

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(); }}

結(jié)果輸出:

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

如何解決死鎖

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

總結(jié)

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

以上就是Java中的多線程一定就快嗎?的詳細(xì)內(nèi)容,更多關(guān)于Java 多線程的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕亚洲在线观看| 视频一区视频二区在线观看| 蜜桃一区二区三区在线观看| 久久三级福利| 伊人久久成人| 日韩黄色在线观看| 久久国产精品99国产| 91精品电影| 免费av一区| 午夜欧美精品久久久久久久| 伊人精品在线| 亚洲三区欧美一区国产二区| 日本成人一区二区| 国产欧美欧美| 国产欧美日韩一级| 久久精品国产久精国产| 国产不卡人人| 欧美肉体xxxx裸体137大胆| av日韩中文| 欧美中文字幕一区二区| 欧洲激情综合| 亚洲精品乱码| 欧美激情福利| 麻豆精品蜜桃| 国产一区二区高清| 日韩激情一区二区| 美女精品视频在线| 日韩av免费| 久久夜色精品| 国产精品欧美在线观看| 欧美黄页在线免费观看| 亚洲午夜天堂| 欧美日韩国产一区二区三区不卡| 亚洲激情av| 日本伊人午夜精品| 国产高清精品二区| 激情亚洲影院在线观看| 日韩一级不卡| 久久国产三级| 中文字幕在线官网| 久久高清免费观看| 国产精品久久久久77777丨| 日本精品影院| 久久最新视频| 精品视频黄色| 黄色成人91| 国产午夜久久av| 日韩国产在线| 伊人久久婷婷| 美女久久99| 欧美亚洲在线日韩| 日韩国产91| 欧美日韩尤物久久| 日韩精品免费视频一区二区三区| 成人国产精品| 日韩在线观看一区二区| 免费在线观看一区| 五月天久久777| 国产精品99久久免费观看| 91精品精品| 日韩av一区二区三区四区| 日本激情一区| 亚洲人成高清| 成人午夜网址| 免费看黄色91| 日本精品不卡| 欧美精品三级在线| 久久亚洲专区| 国产精品高清一区二区| 欧美在线亚洲| 国产一区二区三区亚洲综合| 亚洲三区欧美一区国产二区| 欧美日韩精品免费观看视完整| 国产欧美日韩一区二区三区四区 | 欧美黄色精品| 最新日韩欧美| 中文字幕人成乱码在线观看| 日韩高清一区| 午夜久久99| 中文字幕在线高清| 国产精品白丝一区二区三区| 亚洲我射av| 久久五月天小说| 日韩综合在线| 国产精品99精品一区二区三区∴| 噜噜噜躁狠狠躁狠狠精品视频| 国产不卡精品在线| 日本不卡视频在线| 国产综合亚洲精品一区二| 久久久久伊人| 日韩精品免费一区二区夜夜嗨| 亚洲精品中文字幕乱码| 国内精品伊人| 国产精品久久久久久久久久白浆 | 精品91福利视频| 日本成人手机在线| 蜜桃av一区二区| 激情欧美一区二区三区| 国产传媒在线观看| 精品视频网站| 国产精品午夜一区二区三区| 亚洲毛片一区| 麻豆亚洲精品| 99国产精品视频免费观看一公开| 日韩精品免费一区二区三区| www.51av欧美视频| 国产精品麻豆成人av电影艾秋| 日韩高清一级| 日韩高清一级| 亚洲欧美在线专区| 三级欧美在线一区| 中文精品视频| 午夜久久一区| 99在线精品视频在线观看 | 在线精品亚洲欧美日韩国产| 久久这里只有| 久久精品国产免费| 国产不卡av一区二区| 国产成人精品一区二区三区视频 | 精品久久97| 国产精品成人一区二区网站软件| 日本在线视频一区二区| 亚洲精品在线a| 日韩精品一区二区三区av | 日欧美一区二区| 中文字幕一区二区av| 日韩在线视频一区二区三区| 国产精品美女久久久| 宅男噜噜噜66国产日韩在线观看| 999国产精品| 亚洲第一区色| 午夜久久久久| 亚洲图片久久| 欧美永久精品| 欧美国产精品| 福利一区在线| 999国产精品视频| 亚洲欧洲一区| 久久成人亚洲| 四虎成人精品一区二区免费网站| 日韩av在线播放中文字幕| 国产精品igao视频网网址不卡日韩 | **爰片久久毛片| 国产高清精品二区| 日韩在线不卡| 国产一区日韩一区| 亚洲欧美日韩在线观看a三区 | 国产精品试看| 日韩精品视频网| 麻豆精品久久久| 国产精品久久久久久久久妇女| 久久精品青草| 久久香蕉精品| 国产一区 二区| 久久婷婷亚洲| 久久久一本精品| 国精品产品一区| 国产成人77亚洲精品www| 欧美日韩免费看片| 婷婷精品进入| 亚洲精品国产日韩| 国产精品对白| 日本不良网站在线观看| 在线一区电影| 日韩二区三区在线观看| 国产精品porn| 久久精品国产68国产精品亚洲| 视频一区视频二区中文字幕| 国产欧美三级| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产一区日韩| 国产视频一区在线观看一区免费| 日本强好片久久久久久aaa| 久久婷婷国产| 免费视频亚洲| 亚洲ww精品| 成人一区而且| 少妇精品久久久一区二区| 丰满少妇一区| 在线观看一区| 国产一区二区久久久久| 最新国产拍偷乱拍精品| 国产欧美日韩影院| 久久精品国产亚洲夜色av网站| 日韩久久一区| 色婷婷精品视频| 国产欧美日韩一区二区三区在线| 亚洲性视频h| 欧美亚洲tv| 国产99久久| 欧美久久香蕉| 九九在线精品| 国产精品亚洲产品| 激情欧美丁香| 国产精品久久久久av蜜臀 | 乱人伦精品视频在线观看| 久久精品国产99国产| 国产亚洲高清视频| 国产毛片精品| 久久av一区|