并發(fā)活性
并發(fā)應(yīng)用程序及時(shí)執(zhí)行的能力被稱(chēng)為其活性,本節(jié)描述了最常見(jiàn)的活性問(wèn)題,死鎖,并繼續(xù)簡(jiǎn)要描述其他兩個(gè)活性問(wèn)題,饑餓和活鎖。
死鎖死鎖描述了兩個(gè)或多個(gè)線程永遠(yuǎn)被阻塞,等待彼此的情況,這是一個(gè)例子。
Alphonse和Gaston是朋友,是禮貌的忠實(shí)信徒,禮貌的一個(gè)嚴(yán)格規(guī)則是,當(dāng)你向朋友鞠躬時(shí),你必須一直鞠躬,直到你的朋友有機(jī)會(huì)還禮,不幸的是,這條規(guī)則沒(méi)有考慮到兩個(gè)朋友可能同時(shí)互相鞠躬的可能性,這個(gè)示例應(yīng)用程序Deadlock模擬了這種可能性:
public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void bow(Friend bower) { System.out.format("%s: %s" + " has bowed to me!%n", this.name, bower.getName()); bower.bowBack(this); } public synchronized void bowBack(Friend bower) { System.out.format("%s: %s" + " has bowed back to me!%n", this.name, bower.getName()); } } public static void main(String[] args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston = new Friend("Gaston"); new Thread(new Runnable() { public void run() { alphonse.bow(gaston); } }).start(); new Thread(new Runnable() { public void run() { gaston.bow(alphonse); } }).start(); } }
當(dāng)Deadlock運(yùn)行時(shí),兩個(gè)線程在嘗試調(diào)用bowBack時(shí)極有可能會(huì)阻塞,兩個(gè)阻塞都不會(huì)結(jié)束,因?yàn)槊總€(gè)線程都在等待另一個(gè)線程退出bow。
饑餓和活鎖饑餓和活鎖問(wèn)題遠(yuǎn)沒(méi)有死鎖常見(jiàn),但仍然是每個(gè)并發(fā)軟件設(shè)計(jì)人員可能遇到的問(wèn)題。
饑餓饑餓描述了一種情況,即線程無(wú)法獲得對(duì)共享資源的定期訪問(wèn),并且無(wú)法取得進(jìn)展,當(dāng)“貪婪”線程使共享資源長(zhǎng)時(shí)間不可用時(shí)會(huì)發(fā)生這種情況。例如,假設(shè)一個(gè)對(duì)象提供了一個(gè)通常需要很長(zhǎng)時(shí)間才能返回的同步方法,如果一個(gè)線程頻繁地調(diào)用此方法,其他也需要頻繁同步訪問(wèn)同一對(duì)象的線程將經(jīng)常被阻塞。
活鎖一個(gè)線程經(jīng)常響應(yīng)另一個(gè)線程的操作,如果另一個(gè)線程的操作也是對(duì)另一個(gè)線程的操作的響應(yīng),則可能導(dǎo)致活鎖。與死鎖一樣,活鎖線程無(wú)法取得進(jìn)一步進(jìn)展,但是,線程不會(huì)被阻塞 — 它們只是太忙于回應(yīng)彼此而無(wú)法繼續(xù)工作。這相當(dāng)于兩個(gè)試圖在走廊里互相通過(guò)的人:Alphonse向左移動(dòng)讓Gaston通過(guò),而Gaston向右移動(dòng)讓Alphonse通過(guò),看到他們?nèi)匀换ハ嘧枞珹lphone向右移動(dòng),而Gaston向左移動(dòng),他們還在互相阻塞,所以...。
上一篇:同步 下一篇:守護(hù)阻塞文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73034.html
同步 線程主要通過(guò)共享對(duì)字段和引用對(duì)象的引用字段的訪問(wèn)來(lái)進(jìn)行通信,這種通信形式非常有效,但可能產(chǎn)生兩種錯(cuò)誤:線程干擾和內(nèi)存一致性錯(cuò)誤,防止這些錯(cuò)誤所需的工具是同步。 但是,同步可能會(huì)引入線程競(jìng)爭(zhēng),當(dāng)兩個(gè)或多個(gè)線程同時(shí)嘗試訪問(wèn)同一資源并導(dǎo)致Java運(yùn)行時(shí)更慢地執(zhí)行一個(gè)或多個(gè)線程,甚至?xí)和K鼈儓?zhí)行,饑餓和活鎖是線程競(jìng)爭(zhēng)的形式。 本節(jié)包括以下主題: 線程干擾描述了當(dāng)多個(gè)線程訪問(wèn)共享數(shù)據(jù)時(shí)如何引入錯(cuò)誤。...
Java? 教程 Java教程是為JDK 8編寫(xiě)的,本頁(yè)面中描述的示例和實(shí)踐沒(méi)有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語(yǔ)言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個(gè)完整的工作示例和數(shù)十個(gè)課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識(shí)的路徑 這些教程以書(shū)籍的形式提供,如Java教程,第六版,前往Amazon.com購(gòu)買(mǎi)。 入門(mén) 介紹Java技術(shù)和安裝Java開(kāi)發(fā)軟件并使用...
Lock對(duì)象 同步代碼依賴(lài)于簡(jiǎn)單的可重入鎖,這種鎖易于使用,但有許多限制,java.util.concurrent.locks包支持更復(fù)雜的鎖定語(yǔ)法,我們不會(huì)詳細(xì)檢查這個(gè)包,而是將重點(diǎn)放在其最基本的接口Lock上。 Lock對(duì)象的工作方式與同步代碼使用的隱式鎖定非常相似,與隱式鎖一樣,一次只有一個(gè)線程可以擁有一個(gè)Lock對(duì)象,Lock對(duì)象還通過(guò)其關(guān)聯(lián)的Condition對(duì)象支持wait/notif...
摘要:學(xué)習(xí)和掌握技術(shù)已經(jīng)不是一個(gè)攻城獅的加分技能,而是一個(gè)必備技能。是雙向的,不僅可以讀取數(shù)據(jù)還能保存數(shù)據(jù),程序不能直接讀寫(xiě)通道,只與緩沖區(qū)交互為了讓大家不被高并發(fā)與大量連接處理問(wèn)題所困擾,動(dòng)力節(jié)點(diǎn)推出了高效處理模型應(yīng)用教程。 大家肯定了解Java IO, 但是對(duì)于NIO一般是陌生的,而現(xiàn)在使用到NIO的場(chǎng)景越來(lái)越多,很多技術(shù)框...
守護(hù)阻塞 線程通常必須協(xié)調(diào)他們的操作,最常見(jiàn)的協(xié)調(diào)用法是守護(hù)阻塞,這樣的阻塞首先輪詢(xún)一個(gè)條件,該條件必須為真,然后阻塞才能繼續(xù),要正確執(zhí)行此操作,需要執(zhí)行許多步驟。 例如,假設(shè)guardedJoy是一個(gè)方法,在另一個(gè)線程設(shè)置了共享變量joy之前,該方法不能繼續(xù),理論上,這種方法可以簡(jiǎn)單地循環(huán)直到滿足條件,但該循環(huán)是浪費(fèi)的,因?yàn)樗诘却龝r(shí)持續(xù)執(zhí)行。 public void guardedJoy() ...
閱讀 3593·2021-11-23 09:51
閱讀 2795·2021-11-23 09:51
閱讀 676·2021-10-11 10:59
閱讀 1672·2021-09-08 10:43
閱讀 3223·2021-09-08 09:36
閱讀 3289·2021-09-03 10:30
閱讀 3293·2021-08-21 14:08
閱讀 2195·2021-08-05 09:59