java 并发 mobi_Java并发编程的艺术pdf txt mobi下载及读书笔记
Java并發(fā)編程的藝術(shù)pdf txt mobi讀書筆記
如何解決資源限制的問題:對于軟件資源限制,可以考慮使用資源池將資源復(fù)用。比如使用連接池將數(shù)據(jù)庫和Socket連接復(fù)用,或者在調(diào)用對方webservice接口獲取數(shù)據(jù)時,只建立一個連接。
作者:方騰飛
Java并發(fā)編程的藝術(shù)pdf txt mobi下載
閱讀感悟:鎖是個非常有用的工具,運(yùn)用場景非常多,因?yàn)樗褂闷饋矸浅:唵?#xff0c;而且易于理解。但同時它也會帶來一些困擾,那就是可能會引起死鎖,一旦產(chǎn)生死鎖,就會造成系統(tǒng)功能不可用。讓我們先來看一段代碼,這段代碼會引起死鎖,使線程t1和線程t2互相等待對方釋放鎖。
public class DeadLockDemo {
privat static String A = "A";
private static String B = "B";
public static void main(String[] args) {
new DeadLockDemo().deadLock();
}
private void deadLock() {
Thread t1 = new Thread(new Runnable() {
@Override
publicvoid run() {
synchronized (A) {
try { Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (B) {
System.out.println("1");
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
publicvoid run() {
synchronized (B) {
synchronized (A) {
System.out.println("2");
}
}
}
});
t1.start();
t2.start();
}
}
這段代碼只是演示死鎖的場景,在現(xiàn)實(shí)中你可能不會寫出這樣的代碼。但是,在一些更為復(fù)雜的場景中,你可能會遇到這樣的問題,比如t1拿到鎖之后,因?yàn)橐恍┊惓G闆r沒有釋放鎖(死循環(huán))。又或者是t1拿到一個數(shù)據(jù)庫鎖,釋放鎖的時候拋出了異常,沒釋放掉。
一旦出現(xiàn)死鎖,業(yè)務(wù)是可感知的,因?yàn)椴荒芾^續(xù)提供服務(wù)了,那么只能通過dump線程查看到底是哪個線程出現(xiàn)了問題,以下線程信息告訴我們是DeadLockDemo類的第42行和第31行引起的死鎖。
"Thread-2" prio=5 tid=7fc0458d1000 nid=0x116c1c000 waiting for monitor entry [116c1b000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.ifeve.book.forkjoin.DeadLockDemo$2.run(DeadLockDemo.java:42)
- waiting to lock <7fb2f3ec0> (a java.lang.String)
- locked <7fb2f3ef8> (a java.lang.String)
at java.lang.Thread.run(Thread.java:695)
"Thread-1" prio=5 tid=7fc0430f6800 nid=0x116b19000 waiting for monitor entry [116b18000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.ifeve.book.forkjoin.DeadLockDemo$1.run(DeadLockDemo.java:31)
- waiting to lock <7fb2f3ef8> (a java.lang.String)
- locked <7fb2f3ec0> (a java.lang.String)
at java.lang.Thread.run(Thread.java:695)
現(xiàn)在我們介紹避免死鎖的幾個常見方法。
·避免一個線程同時獲取多個鎖。
·避免一個線程在鎖內(nèi)同時占用多個資源,盡量保證每個鎖只占用一個資源。
·嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內(nèi)部鎖機(jī)制。
·對于數(shù)據(jù)庫鎖,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況。
資源限制的挑戰(zhàn)
(1)什么是資源限制
資源限制是指在進(jìn)行并發(fā)編程時,程序的執(zhí)行速度受限于計算機(jī)硬件資源或軟件資源。例如,服務(wù)器的帶寬只有2Mb/s,某個資源的下載速度是1Mb/s每秒,系統(tǒng)啟動10個線程下載資源,下載速度不會變成10Mb/s,所以在進(jìn)行并發(fā)編程時,要考慮這些資源的限制。硬件資源限制有帶寬的上傳/下載速度、硬盤讀寫速度和CPU的處理速度。軟件資源限制有數(shù)據(jù)庫的連接數(shù)和socket連接數(shù)等。
(2)資源限制引發(fā)的問題
在并發(fā)編程中,將代碼執(zhí)行速度加快的原則是將代碼中串行執(zhí)行的部分變成并發(fā)執(zhí)行,但是如果將某段串行的代碼并發(fā)執(zhí)行,因?yàn)槭芟抻谫Y源,仍然在串行執(zhí)行,這時候程序不僅不會加快執(zhí)行,反而會更慢,因?yàn)樵黾恿松舷挛那袚Q和資源調(diào)度的時間。例如,之前看到一段程序使用多線程在辦公網(wǎng)并發(fā)地下載和處理數(shù)據(jù)時,導(dǎo)致CPU利用率達(dá)到100%,幾個小時都不能運(yùn)行完成任務(wù),后來修改成單線程,一個小時就執(zhí)行完成了。
(3)如何解決資源限制的問題
對于硬件資源限制,可以考慮使用集群并行執(zhí)行程序。既然單機(jī)的資源有限制,那么就讓程序在多機(jī)上運(yùn)行。比如使用ODPS、Hadoop或者自己搭建服務(wù)器集群,不同的機(jī)器處理不同的數(shù)據(jù)。可以通過“數(shù)據(jù)ID%機(jī)器數(shù)”,計算得到一個機(jī)器編號,然后由對應(yīng)編號的機(jī)器處理這筆數(shù)據(jù)。
對于軟件資源限制,可以考慮使用資源池將資源復(fù)用。比如使用連接池將數(shù)據(jù)庫和Socket連接復(fù)用,或者在調(diào)用對方webservice接口獲取數(shù)據(jù)時,只建立一個連接。
(4)在資源限制情況下進(jìn)行并發(fā)編程
如何在資源限制的情況下,讓程序執(zhí)行得更快呢?方法就是,根據(jù)不同的資源限制調(diào)整程序的并發(fā)度,比如下載文件程序依賴于兩個資源——帶寬和硬盤讀寫速度。有數(shù)據(jù)庫操作時,涉及數(shù)據(jù)庫連接數(shù),如果SQL語句執(zhí)行非常快,而線程的數(shù)量比數(shù)據(jù)庫連接數(shù)大很多,則某些線程會被阻塞,等待數(shù)據(jù)庫連接。
總結(jié)
以上是生活随笔為你收集整理的java 并发 mobi_Java并发编程的艺术pdf txt mobi下载及读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 合并流_使用流执行聚合
- 下一篇: eclipse java混淆打包_ecl