丝袜人妻一区二区三区_少妇福利无码视频_亚洲理论片在线观看_一级毛片国产A级片

當前位置:首頁 > 話題廣場 > 攻略專題 > 游戲問答

00000007b怎么解決?總結很全面速看!寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點

一直以來,并發(fā)編程對新進來的小白來說一直覺得很深刻,所以誕生了,為了提高理解和積累并發(fā)編程的認識,想寫點什么。(莎士比亞,莎士比亞。)

為什么需要用的并發(fā)?

凡事總有好壞兩面,之間的trade-off是什么,也就是說并發(fā)編程具有哪些缺點?以及在進行并發(fā)編程時應該了解和掌握的概念是什么?這篇文章主要以這三個問題來談一談。

1. 為什么要用到并發(fā)

一直以來,硬件的發(fā)展極其迅速,也有一個很著名的"摩爾定律",可能會奇怪明明討論的是并發(fā)編程為什么會扯到了硬件的發(fā)展,這其中的關系應該是多核CPU的發(fā)展為并發(fā)編程提供的硬件基礎。

摩爾定律并不是一種自然法則或者是物理定律,它只是基于認為觀測數(shù)據(jù)后,對未來的一種預測。按照所預測的速度,我們的計算能力會按照指數(shù)級別的速度增長,不久以后會擁有超強的計算能力,正是在暢想未來的時候,2004年,Intel宣布4GHz芯片的計劃推遲到2005年,然后在2004年秋季,Intel宣布徹底取消4GHz的計劃,也就是說摩爾定律的有效性超過了半個世紀戛然而止。

但是,聰明的硬件工程師并沒有停止研發(fā)的腳步,他們?yōu)榱诉M一步提升計算速度,而不是再追求單獨的計算單元,而是將多個計算單元整合到了一起,也就是形成了多核CPU。短短十幾年的時間,家用型CPU,比如Intel i7就可以達到4核心甚至8核心。而專業(yè)服務器則通??梢赃_到幾個獨立的CPU,每一個CPU甚至擁有多達8個以上的內核。

因此,摩爾定律似乎在CPU核心擴展上繼續(xù)得到體驗。因此,多核的CPU的背景下,催生了并發(fā)編程的趨勢,通過并發(fā)編程的形式可以將多核CPU的計算能力發(fā)揮到極致,性能得到提升。

頂級計算機科學家Donald Ervin Knuth如此評價這種情況:在我看來,這種現(xiàn)象(并發(fā))或多或少是由于硬件設計者無計可施了導致的,他們將摩爾定律的責任推給了軟件開發(fā)者。

另外,在特殊的業(yè)務場景下先天的就適合于并發(fā)編程。比如在圖像處理領域,一張1024X768像素的圖片,包含達到78萬6千多個像素。即時將所有的像素遍歷一邊都需要很長的時間,面對如此復雜的計算量就需要充分利用多核的計算的能力。

又比如當我們在網(wǎng)上購物時,為了提升響應速度,需要拆分,減庫存,生成訂單等等這些操作,就可以進行拆分利用多線程的技術完成。面對復雜業(yè)務模型,并行程序會比串行程序更適應業(yè)務需求,而并發(fā)編程更能吻合這種業(yè)務拆分 。正是因為這些優(yōu)點,使得多線程技術能夠得到重視,也是一名CS學習者應該掌握的:

  • 充分利用多核CPU的計算能力;
  • 方便進行業(yè)務拆分,提升應用性能

2. 并發(fā)編程有哪些缺點

多線程技術有這么多的好處,難道就沒有一點缺點么,就在任何場景下就一定適用么?很顯然不是。

2.1 頻繁的上下文切換

時間片是CPU分配給各個線程的時間,因為時間非常短,所以CPU不斷通過切換線程,讓我們覺得多個線程是同時執(zhí)行的,時間片一般是幾十毫秒。

而每次切換時,需要保存當前的狀態(tài)起來,以便能夠進行恢復先前狀態(tài),而這個切換時非常損耗性能,過于頻繁反而無法發(fā)揮出多線程編程的優(yōu)勢。通常減少上下文切換可以采用無鎖并發(fā)編程,CAS算法,使用最少的線程和使用協(xié)程。

  • 無鎖并發(fā)編程:可以參照concurrentHashMap鎖分段的思想,不同的線程處理不同段的數(shù)據(jù),這樣在多線程競爭的條件下,可以減少上下文切換的時間。
  • CAS算法,利用Atomic下使用CAS算法來更新數(shù)據(jù),使用了樂觀鎖,可以有效的減少一部分不必要的鎖競爭帶來的上下文切換
  • 使用最少線程:避免創(chuàng)建不需要的線程,比如任務很少,但是創(chuàng)建了很多的線程,這樣會造成大量的線程都處于等待狀態(tài)
  • 協(xié)程:在單線程里實現(xiàn)多任務的調度,并在單線程里維持多個任務間的切換

由于上下文切換也是個相對比較耗時的操作,所以在"java并發(fā)編程的藝術"一書中有過一個實驗,并發(fā)累加未必會比串行累加速度要快。 可以使用Lmbench3測量上下文切換的時長 vmstat測量上下文切換次數(shù)。

2.2 線程安全

多線程編程中最難以把握的就是臨界區(qū)線程安全問題,稍微不注意就會出現(xiàn)死鎖的情況,一旦產(chǎn)生死鎖就會造成系統(tǒng)功能不可用。

public class DeadLockDemo {

private static String resource_a = "A";

private static String resource_b = "B";

public static void main(String[] args) {

deadLock();

}

public static void deadLock() {

Thread threadA = new Thread(new Runnable() {

@Override

public void run() {

synchronized (resource_a) {

Sy("get resource a");

try {

T(3000);

synchronized (resource_b) {

Sy("get resource b");

}

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

Thread threadB = new Thread(new Runnable() {

@Override

public void run() {

synchronized (resource_b) {

Sy("get resource b");

synchronized (resource_a) {

Sy("get resource a");

}

}

}

});

();

();

}

}

在上面的這個demo中,開啟了兩個線程threadA, threadB,其中threadA占用了resource_a, 并等待被threadB釋放的resource _b。threadB占用了resource _b正在等待被threadA釋放的resource _a。

因此threadA,threadB出現(xiàn)線程安全的問題,形成死鎖。同樣可以通過jps,jstack證明這種推論:

"Thread-1":

waiting to lock monitor 0x000000000b695360 (object 0x00000007d5ff53a8, a java.lang.String),

which is held by "Thread-0"

"Thread-0":

waiting to lock monitor 0x000000000b697c10 (object 0x00000007d5ff53d8, a java.lang.String),

which is held by "Thread-1"

Java stack information for the threads listed above:

===================================================

"Thread-1":

at learn.DeadLockDemo$2.run(DeadLockDemo.java:34)

- waiting to lock <0x00000007d5ff53a8(a java.lang.String)

- locked <0x00000007d5ff53d8(a java.lang.String)

at java.lang.T(Thread.java:722)

"Thread-0":

at learn.DeadLockDemo$1.run(DeadLockDemo.java:20)

- waiting to lock <0x00000007d5ff53d8(a java.lang.String)

- locked <0x00000007d5ff53a8(a java.lang.String)

at java.lang.T(Thread.java:722)

Found 1 deadlock.

如上所述,完全可以看出當前死鎖的情況。

那么,通常可以用如下方式避免死鎖的情況:

  • 避免一個線程同時獲得多個鎖;
  • 避免一個線程在鎖內部占有多個資源,盡量保證每個鎖只占用一個資源;
  • 嘗試使用定時鎖,使用lock.tryLock(timeOut),當超時等待時當前線程不會阻塞;
  • 對于數(shù)據(jù)庫鎖,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況

所以,如何正確的使用多線程編程技術有很大的學問,比如如何保證線程安全,如何正確理解由于JMM內存模型在原子性,有序性,可見性帶來的問題,比如數(shù)據(jù)臟讀,DCL等這些問題(在后續(xù)篇幅會講述)。而在學習多線程編程技術的過程中也會讓你收獲頗豐。

3. 應該了解的概念

3.1 同步VS異步

同步和異步通常用來形容一次方法調用。同步方法調用一開始,調用者必須等待被調用的方法結束后,調用者后面的代碼才能執(zhí)行。而異步調用,指的是,調用者不用管被調用方法是否完成,都會繼續(xù)執(zhí)行后面的代碼,當被調用的方法完成后會通知調用者。

比如,在超時購物,如果一件物品沒了,你得等倉庫人員跟你調貨,直到倉庫人員跟你把貨物送過來,你才能繼續(xù)去收銀臺付款,這就類似同步調用。而異步調用了,就像網(wǎng)購,你在網(wǎng)上付款下單后,什么事就不用管了,該干嘛就干嘛去了,當貨物到達后你收到通知去取就好。

3.2 并發(fā)與并行

并發(fā)和并行是十分容易混淆的概念。并發(fā)指的是多個任務交替進行,而并行則是指真正意義上的“同時進行”。實際上,如果系統(tǒng)內只有一個CPU,而使用多線程時,那么真實系統(tǒng)環(huán)境下不能并行,只能通過切換時間片的方式交替進行,而成為并發(fā)執(zhí)行任務。真正的并行也只能出現(xiàn)在擁有多個CPU的系統(tǒng)中。

3.3 阻塞和非阻塞

阻塞和非阻塞通常用來形容多線程間的相互影響,比如一個線程占有了臨界區(qū)資源,那么其他線程需要這個資源就必須進行等待該資源的釋放,會導致等待的線程掛起,這種情況就是阻塞,而非阻塞就恰好相反,它強調沒有一個線程可以阻塞其他線程,所有的線程都會嘗試地往前運行。

3.4 臨界區(qū)

臨界區(qū)用來表示一種公共資源或者說是共享數(shù)據(jù),可以被多個線程使用。但是每個線程使用時,一旦臨界區(qū)資源被一個線程占有,那么其他線程必須等待。

1.《00000007b怎么解決?總結很全面速看!寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關,侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《00000007b怎么解決?總結很全面速看!寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點》僅供讀者參考,本網(wǎng)站未對該內容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉載時請保留本站內容來源地址,http://f99ss.com/gl/2216687.html

上一篇

關于1.80傳奇合擊如何調掛,你需要知道這些熱血合擊傳奇新手攻略

下一篇

14年如何簡單上淘金幣活動?終于找到答案了9月淘金幣玩法,十天刷了不到30單,訪客輕松破了三萬

00000007b怎么解決看這里!JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決看這里!JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決相關介紹,1.堆棧、堆棧、方法區(qū)域交互 查看是否共享線程。 互動 2.理解方法領域 2.1正式文件 the Java virtual machine has a method area that is shar...

關于00000007b怎么解決,你需要知道這些寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點

關于00000007b怎么解決,你需要知道這些寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點

00000007b怎么解決相關介紹,一直以來并發(fā)編程對于剛入行的小白來說總是覺得高深莫測,于是乎,就誕生了想寫點東西記錄下,以提升理解和堆并發(fā)編程的認知。為什么需要用的并發(fā)? 凡事總有好壞兩面,之間的trade-off是什么,也就是說并...

00000007b怎么解決?我來告訴你答案JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決?我來告訴你答案JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決相關介紹,1. 棧、堆、方法區(qū)的交互關系 從線程共享與否的角度來看 交互關系 2. 方法區(qū)的理解 2.1 官方文檔 The Java Virtual Machine has a method area that...

00000007b怎么解決

00000007b怎么解決

00000007b怎么解決相關介紹,有的友友藍屏了,不知道怎么辦了,下面就是藍屏錯誤代碼的解釋。自己就查看代碼解決藍屏問題。希望對友友們有所幫助。歡迎收藏備用。 0x00000000 作業(yè)完成。 0x00000001 不正確的函數(shù)。 0...

00000007b怎么解決?終于找到答案了JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決?終于找到答案了JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決相關介紹,1. 棧、堆、方法區(qū)的交互關系 從線程共享與否的角度來看 交互關系 2. 方法區(qū)的理解 2.1 官方文檔 The Java Virtual Machine has a method area that...

關于00000007b怎么解決,你需要知道這些JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

關于00000007b怎么解決,你需要知道這些JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決相關介紹,1. 棧、堆、方法區(qū)的交互關系 從線程共享與否的角度來看 交互關系 2. 方法區(qū)的理解 2.1 官方文檔 The Java Virtual Machine has a method area that...

00000007b怎么解決?總結很全面速看!JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決?總結很全面速看!JVM系列(七)運行時數(shù)據(jù)區(qū)(方法區(qū))

00000007b怎么解決相關介紹,1. 棧、堆、方法區(qū)的交互關系 從線程共享與否的角度來看 交互關系 2. 方法區(qū)的理解 2.1 官方文檔 The Java Virtual Machine has a method area that...

00000007b怎么解決?終于找到答案了寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點

00000007b怎么解決?終于找到答案了寧波上元教育:什么是并發(fā)編程,并發(fā)編程的優(yōu)缺點

00000007b怎么解決相關介紹,一直以來并發(fā)編程對于剛入行的小白來說總是覺得高深莫測,于是乎,就誕生了想寫點東西記錄下,以提升理解和堆并發(fā)編程的認知。 達到當天最大量API KEY 超過次數(shù)限制為什么需要用的并發(fā)? 凡事總有好壞兩面...