Java中的執行緒安全
執行緒安全問題之所以存在,本質原因是:
當多個執行緒訪問同一個資料的時候,可能引起衝突。而且這些執行緒中至少有一個執行緒會改寫這個資料時才會出現衝突,如果所有執行緒都只讀不改寫,則不會衝突。由於這個資料不只被一個執行緒訪問,我們稱這個資料為共享資料。
類中一般會出現三種資料:
- 靜態成員變數
- 普通成員變數
- 方法裡定義的區域性變數(包括方法引數變數)。
對於第三種變數,不管是靜態方法還是動態方法,都不會存線上程安全問題。原因是:
方法在執行的時候,方法裡的區域性變數都是儲存在堆疊上的。而方法的堆疊分配,是在方法每次執行開始時系統分配的,所以即使是呼叫同一方法(不管是不是同一執行緒),所分配的堆疊也是不同的。
對於第二種變數,同一個類的不同的物件例項有不同的成員變數,所以多個執行緒如果可以確定是在操作不同的物件,就不會存在衝突。如果多個執行緒操作的是同一個物件例項,則需要考慮對類內普通成員變數操作的執行緒安全問題。
對於第三種變數,因為這種變數在記憶體中只有一個副本,所以無論什麼時候操作這種變數都需要考慮執行緒安全問題。
相關推薦
Java中執行緒安全的單例模式
Java中執行緒安全的單例 深入研究Servlet執行緒安全性問題 來源:網路整理 作者:2017年12月01日 14:03 0 分享 訂閱 關鍵詞:Servlet執行緒 Servlet(Server Applet)是Java Servle
java中執行緒安全和非執行緒安全的集合
執行緒安全 非執行緒安全 Collection Vector ArrayList、LinkedList H
Java 中執行緒安全問題
不好意思,一個國慶假期給我放的都不知道東西南北了,放鬆,很放鬆,差一點就棄更了,感謝那些催更的小夥伴們! 雖然沒有更新,但是日常的學習還是有的,以後我儘量給大家分享一些通用知識,非技術。 但是本期還是要回歸到之前的多前程的話題。已經說了執行緒和程序的區別、如何實現多執行緒、今天說一說執行緒中的安全問題。
java中執行緒安全問題如何解決?
執行緒安全問題解決方法: 在程式碼中使用同步程式碼塊(同步鎖) 解釋:在某一段任務中,同一時間只允許一個執行緒執行任務,其他的執行緒即使搶到了cpu,也無法進入當前的任務區間,只有當 當前的執行緒將任務執行完後,其他的執行緒才有資格進入. 同步程式碼塊的構成: sy
Java中執行緒安全(synchronized)
package tk.javazhangwei.thread.syn; /*** * 執行緒安全問題 * * @author zw * */ public class SynDemo01 { public static void main(String[]
Java中執行緒安全的加一(+1)操作的三種方式
1.鎖分為樂觀鎖和悲觀鎖,悲觀鎖總是假設每次的臨界區操作會產生衝突,如果多個執行緒同時需要訪問臨界區資源,就寧可犧牲效能讓執行緒進行等待。而樂觀鎖,它會假設對資源的訪問都是沒有衝突的,所有的執行緒都可以在不停頓的狀態下持續執行,如果遇到衝突,樂觀鎖採用的叫做比較交換(CAS
java中執行緒安全,執行緒死鎖,執行緒通訊快速入門
一:多執行緒安全問題 ###1 引入 /* * 多執行緒併發訪問同一個資料資源 * 3個執行緒,對一個票資源,出售 */ public class ThreadDemo { public static void main(String[
Java中執行緒的同步非同步、以及執行緒的安全
什麼是執行緒同步? 這裡的“同”是協同的意思,並不是共同。那麼就很好理解同步了,就是一起操作但並不是同時操作。比如流水線組裝汽車,可以視作一個執行緒,只有裝好了上一步的門,才可以裝下一步的門窗玻璃。沒有裝門能裝上玻璃嗎?顯然不行。所以執
java.util.concurrent包中執行緒安全的集合簡介
一、執行緒安全的集合 Java中有很多支援多執行緒併發的集合,比如Hashtable、Vector但是這些“古老”的併發集合效率並不高,一般只支援一個執行緒對其進行讀寫(加鎖是針對整張表
沉澱再出發:java中執行緒池解析
沉澱再出發:java中執行緒池解析 一、前言 在多執行緒執行的環境之中,如果執行緒執行的時間短但是啟動的執行緒又非常多,執行緒運轉的時間基本上浪費在了建立和銷燬上面,因此有沒有一種方式能夠讓一個執行緒執行完自己的任務之後又被重複使用呢?執行緒池的出現就是為了解決這個問題。到了現在
Java中執行緒池基本api及其作用
1.執行緒池相關的類 2.重要類的api及其方法 Executors.newCachedThreadPool() 建立一個可快取的執行緒池 Executors.newSingleThreadExecutor();建立一個只有一個執行緒執行的 不可修改的執行緒池  
Java之執行緒安全問題
什麼是程序? 電腦中每個程式有一個獨立的程序,而程序之間是相互獨立存在的。 什麼是執行緒? 程序想要執行任務就需要依賴執行緒。程序中的最小執行單位就是執行緒,並且一個程序中至少有一個執行緒。
java中執行緒池的生命週期
執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TERMINATED:termin
Java中執行緒池,你真的會用嗎
轉載自 Java中執行緒池,你真的會用嗎 在《深入原始碼分析Java執行緒池的實現原理》這篇文章中,我們介紹過了Java中執行緒池的常見用法以及基本原理。 在文中有這樣一段描述: 可以通過Executors靜態工廠構建執行緒池,但一般不建議這樣使用。 關於這個
在JAVA中執行緒到底起到什麼作用!
這是javaeye上非常經典的關於執行緒的帖子,寫的非常通俗易懂的,適合任何讀計算機的同學. 執行緒同步 我們可以在計算機上執行各種計算機軟體程式。每一個執行的程式可能包括多個獨立執行的執行緒(Thread)。 執行緒(Thread)是一份獨立執行的程式,有自己專用的執行棧。執行緒有可能和其他執行緒
java中執行緒池的生命週期與執行緒中斷
執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TE
java 對執行緒安全支援有哪些?
同步容器。它的原理是將狀態封裝起來,並對每個公有方法都實行同步,使得每次只有1個執行緒能夠訪問容器的狀態。 Vector和HashTable Collections.synchronizedXXX方法 同步容器的問題
Java中執行緒有幾種狀態
線上程的生命週期裡,執行緒總共有6種狀態,這是Java5之後在公共內部列舉類Thread.State裡面宣告的。他們分別是 NEW:新建,表示的是執行緒被創建出來但還未被投入使用。 RUNNABLE:就緒,這個執行緒已經在JVM裡被執行,有可能是正在執行也有可能是等待CPU分配資源進入了就緒
java中執行緒同步的幾種方法
方法一: 使用synchronized關鍵字 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會
java中執行緒的建立
java中執行緒的建立 package com.carlinfo.bigdata; /** * java中執行緒的建立 */ public class Ops3 { public static void main(String[] args) { /**