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