成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中的多線程調(diào)試基礎知識有哪些

今天就跟大家聊聊有關(guān)Java中的多線程調(diào)試基礎知識有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:成都網(wǎng)站設計、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的那曲網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

多線程調(diào)試基礎
最有價值的調(diào)試工具是以線程為中心的。大部分 Java 錯誤都與線程交互有關(guān)。多線程調(diào)試讓開發(fā)人員可以查看應用程序中運行的每個線程中的執(zhí)行情況。
由于執(zhí)行順序的易變性,查找多線程應用程序中的錯誤比非線程化情況要困難得多。如果可以按相同的可預料順序執(zhí)行指令,那么調(diào)試這些應用程序就可以變得非常簡單。當然,這將違背多線程化的目標。結(jié)果,許多 IDE 調(diào)試器在這種情況下都不能起什么作用,因為單步調(diào)試代碼會減緩調(diào)試過程,并禁止重新創(chuàng)建錯誤事件。

多線程錯誤的類型
這里有幾種常見的多線程編碼問題需要密切關(guān)注:

訪問違規(guī)。當兩個或更多線程試圖訪問同一個內(nèi)存位置時,會發(fā)生這種問題。

死鎖。譬如說 Thread1 鎖定了 ResourceA,而 Thread2 鎖定了 ResourceB。然后Thread1試圖鎖定 ResourceB,并等待 ResourceB 變成可用的。同時,Thread2試圖鎖定 ResourceA 并等待 ResourceA 變成可用的。 結(jié)果:死鎖。防止死鎖的一種方法是不要讓進程在設置了鎖定時睡眠。還可以使用 synchronization() 來確保關(guān)鍵部分的代碼一次只能由一個線程訪問。

數(shù)據(jù)爭用錯誤。數(shù)據(jù)爭用條件會鎖定應用程序,這種情況會時常發(fā)生,譬如雙擊鼠標左鍵。在數(shù)據(jù)爭用的情況下數(shù)據(jù)通常會遭到破壞。要防止這種錯誤,應使變量不能被多個線程訪問。現(xiàn)在已經(jīng)有工具可以分析這種問題并標志可能發(fā)生數(shù)據(jù)爭用錯誤的變量。

同步錯誤。進行無用信息收集時可能會發(fā)生這種問題。Java 會自動處理無用信息收集。此時,所有線程都會從運行狀態(tài)變成暫掛。

使用 synchronized() 方法
不同版本的 JVM 實現(xiàn)線程優(yōu)先級的方法也可能不同,這會影響線程同步。我們建議您在多個操作系統(tǒng)上測試線程化代碼,以驗證它是否真正是跨平臺的。

synchronized() 方法創(chuàng)建了一個模擬鎖定的代碼塊。這個用同步方法描繪的代碼只允許每次只有一個進程運行它。但不要使用太多的 synchronized 調(diào)用,因為它們會直接影響代碼性能。實際上,同步停止了多線程化。

以下顯示了使用同步化方法的代碼示例。通過重新設置實例變量中表的最大的列大小,這段代碼將一個元素添加到表中??梢钥吹蕉鄠€線程更新同一個變量值可能會造成破壞。使用同步化方法有助于緩和這個問題。


/** Synchronized method to add an element to a table **/
public void addElement( Patient newPatient )
{
synchronized ( lock )
{
Log query = incomingPatient.getLog();
results = query.getAllSearchResults();
for ( int k = 0; k < results.length; k++)
{
.... // add to table
setMaxColSize(MyTable);
tableContents.add(MyTable);
}
}
}



避免多線程錯誤
有一些方法可以避免可怕的線程錯誤:

如果依靠線程優(yōu)先級來使線程保持同步,那么測試 JVM 的各種類就顯得非常重要。小心可能發(fā)生兩個線程同時賦值給 long 和 double 變量。其討厭的結(jié)果是一個線程的更改可能更改某個變量,而第二個線程可能再次改變同一個變量。請考慮對那些變量類型進行同步賦值。

永不使用 stop() 方法。實際上,Java 2 中反對該方法。它會立即停止進程,但又不進行整理,這會導致許多問題,包括死鎖和內(nèi)存鎖定。 應始終通過從 run() 方法返回來終止線程。

不要重新啟動已停止的線程。run() 方法沒有被調(diào)用,而 isAlive() 方法報告錯誤,指出實際上線程已死。

不要獨占 CPU。如果程序的一部分獨占了 CPU,就應該運行 yield() 方法,此方法可以讓其它線程也有機會運行。請參閱這個小示例:

double answer = 0;
for (int i=0; i<10000; i++) {
for (int j = 0; i<10000; j++) {
answer = ((answer * i) + j) / j;
}
Thread.yield(); // Now other threads may run while this
//runs in the background
}

看完上述內(nèi)容,你們對Java中的多線程調(diào)試基礎知識有哪些有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

分享題目:Java中的多線程調(diào)試基礎知識有哪些
文章URL:http://jinyejixie.com/article8/pochip.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷企業(yè)建站、App開發(fā)、域名注冊、微信小程序、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設公司
甘孜| 突泉县| 伽师县| 礼泉县| 乐平市| 毕节市| 乌鲁木齐市| 淮滨县| 华容县| 新沂市| 左权县| 崇文区| 台江县| 广宁县| 北辰区| 白朗县| 宜兴市| 商水县| 读书| 广州市| 滁州市| 西安市| 靖安县| 鹤山市| 含山县| 都江堰市| 呼玛县| 大理市| 普安县| 罗平县| 天气| 崇礼县| 武乡县| 安国市| 霍城县| 怀柔区| 和田市| 阳东县| 通化市| 建宁县| 青海省|