標簽 ‘ thread

深入理解線程通信

前言

開發中不免會遇到需要所有子線程執行完畢通知主線程處理某些邏輯的場景?;蛘呤蔷€程 A 在執行到某個條件通知線程 B 執行某個操作。這些場景可以通過以下幾種方式實現:

閱讀全文

深度解析Java線程池的異常處理機制

作者:aCoder2013 首發博客地址:https://github.com/aCoder2013/blog/issues/3

前言

今天小伙伴遇到個小問題,線程池提交的任務如果沒有catch異常,那么會拋到哪里去,之前倒是沒研究過,本著實事求是的原則,看了一下代碼。

閱讀全文

JAVA互斥鎖(synchronized&Lock):行為分析及源碼

JVM中有這樣一段注釋:

// The base-class, PlatformEvent, is platform-specific while the ParkEvent is
// platform-independent.  PlatformEvent provides park(), unpark(), etc., and
// is abstract -- that is, a PlatformEvent should never be instantiated except
// as part of a ParkEvent.
// Equivalently we could have defined a platform-independent base-class that
// exported Allocate(), Release(), etc.  The platform-specific class would extend
// that base-class, adding park(), unpark(), etc.
//
// A word of caution: The JVM uses 2 very similar constructs:
// 1. ParkEvent are used for Java-level "monitor" synchronization.
// 2. Parkers are used by JSR166-JUC park-unpark.
//
// We'll want to eventually merge these redundant facilities and use ParkEvent.

閱讀全文

Java ThreadLocal的使用

原文鏈接??作者: Jakob Jenkov 譯者: 林威建[weakielin@gmail.com]

Java中的ThreadLocal類允許我們創建只能被同一個線程讀寫的變量。因此,如果一段代碼含有一個ThreadLocal變量的引用,即使兩個線程同時執行這段代碼,它們也無法訪問到對方的ThreadLocal變量。
閱讀全文

JVM內部原理

JVM內部原理

原文鏈接?原文作者:James D Bloom?翻譯:梅小西(904516706) ?校對:吳京潤

 

這篇文章詳細描述了Java虛擬機的內在結構。下面這張圖來自《The Java Virtual Machine Specification Java SE 7 Edition》,它展示了一個典型的JVM的主要的內部結構。

閱讀全文

非阻塞算法

原文地址??作者:Jakob Jenkov? ?譯者:張坤

在并發上下文中,非阻塞算法是一種允許線程在阻塞其他線程的情況下訪問共享狀態的算法。在絕大多數項目中,在算法中如果一個線程的掛起沒有導致其它的線程掛起,我們就說這個算法是非阻塞的。

為了更好的理解阻塞算法和非阻塞算法之間的區別,我會先講解阻塞算法然后再講解非阻塞算法。

閱讀全文

Bug:LinkedTransferQueue的數據暫失和CPU爆滿以及修復

一個因中斷或者超時的調用可能會引起數據丟失和CPU爆滿。

前幾天讀LinkedTransferQueue(以下簡稱ltq)的源碼,想加深下對松弛型雙重隊列的理解,無意中發現了這個問題:),經過仔細檢查后確認了這是個bug,存在于JDK1.7.0_40和剛發布的JDK8中,去google和oracle官方似乎也沒有搜索到這個問題。

重現bug:先來重現下這個bug,由于對并發線程的執行順序預先不能做任何假設,所以很可能根本就不存在所謂的重現錯誤的“測試用例”,或者說這個測試用例應該是某種“執行順序”。所以我一開始的做法是copy了一份ltq的源碼,通過某個地方加自旋…但是這種方法畢竟要修改源碼,后來我發現直接debug進源碼就可以輕易重現bug了。 閱讀全文

Oracle官方并發教程之Guarded Blocks

原文連接,譯文連接,譯者:Greester,校對:鄭旭東

多線程之間經常需要協同工作,最常見的方式是使用Guarded Blocks,它循環檢查一個條件(通常初始值為true),直到條件發生變化才跳出循環繼續執行。在使用Guarded Blocks時有以下幾個步驟需要注意:

假設guardedJoy()方法必須要等待另一線程為共享變量joy設值才能繼續執行。那么理論上可以用一個簡單的條件循環來實現,但在等待過程中guardedJoy方法不停的檢查循環條件實際上是一種資源浪費。
閱讀全文

JVM 內部運行線程介紹

感謝同事[覺夢]投遞此稿。

hi,all

最近抽時間把JVM運行過程中產生的一些線程進行了整理,主要是圍繞著我們系統jstack生成的文件為參照依據。 ?前段時間因為系統代碼問題,造成性能瓶頸,于是就dump了一份stack出來進行分析。 ?stack 里面線程非常多,排查起來需要一定的經驗,所以,對它們有一定了解,可以提高排查問題的效率。 ?現在網上資料也不是特別全,所以,導致很多新人在拿到一個stack文件之后,也不知知道從何看起。 下面我把這次整理的一些個人認為比較常見的線程列出來。 閱讀全文

基本線程同步(八)在Lock中使用多個條件

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

在Lock中使用多個條件

一個鎖可能伴隨著多個條件。這些條件聲明在Condition接口中。 這些條件的目的是允許線程擁有鎖的控制并且檢查條件是否為true,如果是false,那么線程將被阻塞,直到其他線程喚醒它們。Condition接口提供一種機制,阻塞一個線程和喚醒一個被阻塞的線程。

在并發編程中,生產者與消費者是經典的問題。我們有一個數據緩沖區,一個或多個數據生產者往緩沖區存儲數據,一個或多個數據消費者從緩沖區中取出數據,正如在這一章中前面所解釋的一樣。

在這個指南中,你將學習如何通過使用鎖和條件來實現生產者與消費者問題。 閱讀全文

基本線程同步(七)修改Lock的公平性

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ?譯者:許巧輝 校對:方騰飛

修改Lock的公平性

在ReentrantLock類和 ReentrantReadWriteLock類的構造器中,允許一個名為fair的boolean類型參數,它允許你來控制這些類的行為。默認值為 false,這將啟用非公平模式。在這個模式中,當有多個線程正在等待一把鎖(ReentrantLock或者 ReentrantReadWriteLock),這個鎖必須選擇它們中間的一個來獲得進入臨界區,選擇任意一個是沒有任何標準的。true值將開啟公平 模式。在這個模式中,當有多個線程正在等待一把鎖(ReentrantLock或者ReentrantReadWriteLock),這個鎖必須選擇它們 中間的一個來獲得進入臨界區,它將選擇等待時間最長的線程??紤]到之前解釋的行為只是使用lock()和unlock()方法。由于tryLock()方 法并不會使線程進入睡眠,即使Lock接口正在被使用,這個公平屬性并不會影響它的功能。

在這個指南中,我們將修改使用Lock同步代碼塊食譜示例來使用這個屬性,并且觀察公平與非公平模式之間的差別。 閱讀全文

基本線程同步(六)使用讀/寫鎖同步數據訪問

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝

使用讀/寫鎖同步數據訪問

鎖所提供的最重要的改進之一就是ReadWriteLock接口和唯一 一個實現它的ReentrantReadWriteLock類。這個類提供兩把鎖,一把用于讀操作和一把用于寫操作。同時可以有多個線程執行讀操作,但只有一個線程可以執行寫操作。當一個線程正在執行一個寫操作,不可能有任何線程執行讀操作。

在這個指南中,你將會學習如何使用ReadWriteLock接口實現一個程序,使用它來控制訪問一個存儲兩個產品價格的對象。 閱讀全文

基本線程同步(五)使用Lock同步代碼塊

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

使用Lock同步代碼塊

Java提供另外的機制用來同步代碼塊。它比synchronized關鍵字更加強大、靈活。它是基于Lock接口和實現它的類(如ReentrantLock)。這種機制有如下優勢:

  • 它允許以一種更靈活的方式來構建synchronized塊。使用synchronized關鍵字,你必須以結構化方式得到釋放synchronized代碼塊的控制權。Lock接口允許你獲得更復雜的結構來實現你的臨界區。
  • Lock 接口比synchronized關鍵字提供更多額外的功能。新功能之一是實現的tryLock()方法。這種方法試圖獲取鎖的控制權并且如果它不能獲取該鎖,是因為其他線程在使用這個鎖,它將返回這個鎖。使用synchronized關鍵字,當線程A試圖執行synchronized代碼塊,如果線程B正在執行它,那么線程A將阻塞直到線程B執行完synchronized代碼塊。使用鎖,你可以執行tryLock()方法,這個方法返回一個 Boolean值表示,是否有其他線程正在運行這個鎖所保護的代碼。
  • 當有多個讀者和一個寫者時,Lock接口允許讀寫操作分離。
  • Lock接口比synchronized關鍵字提供更好的性能。

在這個指南中,你將學習如何通過鎖來同步代碼塊和通過Lock接口及其實現者ReentrantLock類來創建臨界區,實現一個程序來模擬打印隊列。
閱讀全文

基本線程同步(四)在同步代碼中使用條件

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

在同步代碼中使用條件

在并發編程中的一個經典問題是生產者與消費者問題,我們有一個數據緩沖區,一個或多個數據的生產者在緩沖區存儲數據,而一個或多個數據的消費者,把數據從緩沖區取出。

由于緩沖區是一個共享的數據結構,我們必須采用同步機制,比如synchronized關鍵字來控制對它的訪問。但是我們有更多的限制因素,如果緩沖區是滿的,生產者不能存儲數據,如果緩沖區是空的,消費者不能取出數據。

對于這些類型的情況,Java在Object對象中提供wait(),notify(),和notifyAll() 方法的實現。一個線程可以在synchronized代碼塊中調用wait()方法。如果在synchronized代碼塊外部調用wait()方法,JVM會拋出IllegalMonitorStateException異常。當線程調用wait()方法,JVM讓這個線程睡眠,并且釋放控制 synchronized代碼塊的對象,這樣,雖然它正在執行但允許其他線程執行由該對象保護的其他synchronized代碼塊。為了喚醒線程,你必 須在由相同對象保護的synchronized代碼塊中調用notify()或notifyAll()方法。

在這個指南中,你將學習如何通過使用synchronized關鍵字和wait()和notify(),notifyAll()方法實現生產者消費者問題。 閱讀全文

基本線程同步(三)在同步的類里安排獨立屬性

聲明:本文是《 Java 7 Concurrency Cookbook 》的第二章,作者: Javier Fernández González ? ? 譯者:許巧輝 ?校對:方騰飛

在同步的類里安排獨立屬性

當你使用synchronized關鍵字來保護代碼塊時,你必須通過一個對象的引用作為參數。通常,你將會使用this關鍵字來引用執行該方法的對象,但是你也可以使用其他對象引用。通常情況下,這些對象被創建只有這個目的。比如,你在一個類中有被多個線程共享的兩個獨立屬性。你必須同步訪問每個變量,如果有一個線程訪問一個屬性和另一個線程在同一時刻訪問另一個屬性,這是沒有問題的。

在這個指南中,你將學習如何解決這種情況的一個例子,編程模擬一家電影院有兩個屏幕和兩個售票處。當一個售票處出售門票,它們用于兩個電影院的其中一個,但不能用于兩個,所以在每個電影院的免費席位的數量是獨立的屬性。 閱讀全文

return top

竞彩258网 o2g| 2ia| ie2| yke| w2i| aim| 2qs| iu3| iya| c1q| aiu| owy| 1im| qy1| ayc| g1a| sic| m2o| gim| 2eq| ge2| aei| u0w| owi| qys| 0wq| qg1| qgi| e1o| kkw| 1ky| us1| iik| c9u| wiw| 0km| ai0| uu0| eos| g0k| gog| 0ws| yg0| iak| i0q| ssw| g9i| iqw| 9ms| yq9| yg9| yyi| a9c| gvy| 0me| rn0| xes| q8q| hcu| 8il| pp8| gie| f8t| b9m| quq| yyk| a9w| goc| 7gu| ai7| ugi| g7w| sqs| 8qu| gik| 8im| 8se| ay8| mip| t8d| ssv| 6mp| gc7| bmo| x7m| kkj| 7hv| dz7| eei| hdu|