java併發程式設計(一) 執行緒安全(1)
最近想了解併發程式設計,二執行緒安全是它的基礎。所以看了下java相關的執行緒安全知識。
執行緒安全的核心是程式碼正確性(一般是輸出的結果);
首先無狀態的物件是執行緒安全的;因為一個無狀態的物件即不包含其他域;也沒有對其他域的引用;
(1)原子性
原子性:即程式碼不可在分割;例如 a=0;中間沒有其他操作。a++則不是他要先賦值a再執行加法操作。
不是原子性操作的程式碼可能會因為時序或多執行緒操作等等原因導致快取中的物件不是正確的結果。
java提供了鎖機制來保證程式碼塊的原子性。synchronized關鍵字。
執行緒在進入修飾由該關鍵字修飾的程式碼塊之前就自動獲得一個鎖,退出時釋放該鎖。當有一個執行緒持有這種鎖的時候,其他執行緒就必須等待或阻塞。直到持有執行緒釋放。但這帶來了效能較慢的問題。
同時java也提供了重入機制:同一執行緒可再次進入鎖如下
public class Father { public synchronized void doing(){ System.out.println(toString() + ": father doing"); } }<pre name="code" class="java">public class Children extends Father{ public synchronized void doing(){ System.out.println(toString() + ": son doing"); super.doing(); } public static void main(String[] args) { Children children = new Children(); children.doing(); } }
結果如下:
[email protected]: son doing
[email protected]: father doing
表明鎖是可以重新進入的。而且jvm實際上給每進入一次鎖就會在計數值上加1。退出減一。0表示沒鎖定。這種方式提升了封裝性。
我們對於有多個變數的不變性條件,一般這些變數共用一個鎖。
關於鎖與效能:我們對於時間較長的操作:如網路I/O或控制檯I/O,一定不要持有鎖。同時s鎖控制的程式碼塊儘量要小。
相關推薦
Java併發程式設計:什麼是執行緒安全,以及併發必須知道的幾個概念
廢話 眾所周知,在Java的知識體系中,併發程式設計是非常重要的一環,也是面試的必問題,一個好的Java程式設計師是必須對併發程式設計這塊有所瞭解的。為了追求成為一個好的Java程式設計師,我決定從今天開始死磕Java的併發程式設計,儘量彌補自己在這方面的知識缺陷。 併發必須知道的概念
Java併發程式設計規則:構建執行緒安全的共享物件
構建執行緒安全的共享物件,使其在多執行緒環境下能夠提供安全的訪問。編寫正確的併發程式關鍵在於控制共享、可變的狀態進行訪問管理。synchornized關鍵字既可以阻塞程式,也可以維護操作的原子性,它是一個執行緒安全與非執行緒安全的臨界區標識,通過它我們可以控制物件的記憶體可
java併發程式設計(一) 執行緒安全(1)
最近想了解併發程式設計,二執行緒安全是它的基礎。所以看了下java相關的執行緒安全知識。 執行緒安全的核心是程式碼正確性(一般是輸出的結果); 首先無狀態的物件是執行緒安全的;因為一個無狀態的物件即不包含其他域;也沒有對其他域的引用; (1)原子性 原子性:即程式碼不
(十)java併發程式設計--建立和啟動執行緒(java.lang.Thread 、java.lang.Runnable)
執行緒建立的幾種方式. 建立和啟動一個執行緒 建立一個執行緒. Thread thread = new Thread(); 啟動java執行緒. thread.start(); 這兩個例子並沒有執行執行緒執行體,執行緒將會啟動後然後
Java併發包原始碼學習之執行緒池(一)ThreadPoolExecutor原始碼分析
Java中使用執行緒池技術一般都是使用Executors這個工廠類,它提供了非常簡單方法來建立各種型別的執行緒池: public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService
《java併發程式設計實戰》:執行緒同步輔助類之訊號量(semaphore)
1.訊號量的概念: 訊號量是一種計數器,用來保護一個或者多個共享資源的訪問,它是併發程式設計的一種基礎工具,大多數程式語言都提供了這個機制。 2、訊號量控制執行緒訪問流程: 如果執行緒要訪問一個共享資源,它必須先獲得訊號量。如果訊號量的內部計數器大於0,訊號量將減1,然後
java併發程式設計:之守護執行緒(Daemon)
在Java中有兩類執行緒:User Thread(使用者執行緒)、Daemon Thread(守護執行緒) 用個比較通俗的比喻,任何一個守護執行緒都是整個JVM中所有非守護執行緒的保姆:只要當前JVM例項中尚存在任何一個非守護執行緒沒有結束,守護執行緒就全部工作;只有當最後一
Java併發程式設計:4種執行緒池和緩衝佇列BlockingQueue
一. 執行緒池簡介 1. 執行緒池的概念: 執行緒池就是首先建立一些執行緒,它們的集合稱為執行緒池。使用執行緒池可以很好地提高效能,執行緒池在系統啟動時即建立大量空閒的執行緒,程式將一個任務傳給執行緒池,執行緒池就會啟動一
《java併發程式設計實戰》之 執行緒安全性
1.執行緒安全性 當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調程式碼中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼這個類就是執行緒安全的。 無狀態物件一定是執行緒安全的,何為無狀態,就是類中不包含任何域,也不包含各種其
[讀書筆記][Java併發程式設計實戰]第二章 執行緒安全性
第二章 執行緒安全性 1-什麼是執行緒安全的類? 當多個執行緒訪問某一個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調程式碼中不需要任何額外的同步或協同,這個
學了Java併發程式設計藝術及多執行緒核心程式設計技術,以及最開始學的程式設計思想那本書,今天做些總結
併發Map分析位碼shift預設值是28,對hash值右移28位,取高四位,獲得segments位置,掩碼mask預設值16-1,作一個與值,不知道有何用處,兩個都是不可修改,初始值和併發度有關,一旦確立下來決定了segments陣列大小,包括segments陣列物件不可修改
Java併發程式設計中的多執行緒是怎麼實現的?
眾所周知,在Java的知識體系中,併發程式設計是非常重要的一環,也是面試中必問的題,一個好的Java程式設計師是必須對併發程式設計這塊有所瞭解的。 併發必須知道的概念在深入學習併發程式設計之前,我們需要了解幾個基本的概念。同步和非同步同步和非同步用請求返回呼叫的方式來理解相對簡單。 同步:
Java併發程式設計札記-(六)JUC執行緒池-01概述
前面的例子中總是需要執行緒時就建立,不需要就銷燬它。但頻繁建立和銷燬執行緒是很耗資源的,在併發量較高的情況下頻繁建立和銷燬執行緒會降低系統的效率。執行緒池可以通過重複利用已建立的執行緒降低執行緒建立和銷
Java併發程式設計:如何建立執行緒、程序?
在前面一篇文章中已經講述了在程序和執行緒的由來,今天就來講一下在Java中如何建立執行緒,讓執行緒去執行一個子任務。下面先講述一下Java中的應用程式和程序相關的概念知識,然後再闡述如何建立執行緒以及如何建立程序。下面是本文的目錄大綱: 一.Java中關於應
Java併發程式設計中四種執行緒池及自定義執行緒使用教程
引言 通過前面的文章,我們學習了Executor框架中的核心類ThreadPoolExecutor ,對於執行緒池的核心排程機制有了一定的瞭解,並且成功使用ThreadPoolExecutor 建立了執行緒池。 而在Java中,除了ThreadPoolExecutor ,Executor框
Java併發程式設計的藝術(四)——執行緒的狀態
執行緒的狀態 初始態:NEW 建立一個Thread物件,但還未呼叫start()啟動執行緒時,執行緒處於初始態。 執行態:RUNNABLE 在Java中,執行態包括就緒態 和 執行態。 就緒態 該狀態下的執行緒已經獲得執行所需的所有資源
java併發程式設計-再談daemon執行緒
守護執行緒:顧名思義是用來做“守護神”的工作,一直守護著使用者執行緒直到使用者執行緒工作完畢(比如:main執行緒結束)。對於守護執行緒我們需要注意兩點:通過呼叫setDaemon(true)方法將執行
Java併發程式設計的藝術(十)——執行緒池(1)
執行緒池的作用 減少資源的開銷 減少了每次建立執行緒、銷燬執行緒的開銷。 提高響應速度 每次請求到來時,由於執行緒的建立已經完成,故可以直接執行任務,因此提高了響應速度。 提高執行緒的可管理性 執行緒是一種稀缺資源,若不加以限制,不僅會佔用大量資源
Java併發程式設計---Executors多工執行緒框架
一.概念 為了更好地控制多執行緒,JDK提供了一套執行緒框架Executor,幫助開發人員有效地進行執行緒控制.他們都在java.util.concurrent包中,是JDK併發包的核
Java併發程式設計之三:執行緒掛起、恢復與終止的正確方法
出處:http://blog.csdn.NET/ns_code/article/details/17095733 掛起和恢復執行緒 Thread 的API中包含兩個被淘汰的方法,它們用於臨時掛起和重啟某個執行緒,這些方法已經被淘汰,因為它們是不安全的,不穩定的。如果