1. java 多線程線程安全問題怎麼解決
可以用關鍵字synchronized來維護;
語法:
synchronized(對象名)
{
< 需要保護的代碼>
}
具體的請訪問http://ke..com/link?url=-查看synchronized的用法
希望能幫到你。
2. 如何解決線程安全問題
有2種解決方法。
第一,是採用原子變數,畢竟線程安全問題最根本上是由於全局變數和靜態變數引起的,只要保證了對於變數的寫操作要麼全寫要麼不寫,就可以解決線程安全,定義變數用sig_atomic_t和volatile。
第二,就是實現線程間同步啦,用互斥索,信號量。讓線程有序的訪問變數就可以啦
3. c# lock方法,解決線程安全的問題,同時產生了線程等待的問題,怎麼解決等待的問題呢
競態條件和死鎖。如果兩個或多個線程訪問相同的對象,或者訪問不同步的共享狀態 ,就會出現競態條件。為了避免出現該問題,可以鎖定共享的對象。但是過多的鎖定也會有麻煩,那就是死鎖。當至少有兩個線程被掛起,等待對方解除鎖定。由於兩個線程都在等待對方,就出現了死鎖,線程將無限等下去。要避免同步問題,最好不要在線程之間共享數據。當然,這並不總是可行的。如果需要共享數據,就必須使用同步技術,確保一次只有一個線程訪問和改變共享狀態。注意,同步問題與競態條件和死鎖有關。如果不注意這些問題,就很難在應用程序中找到問題的原因,因為線程問題是不定期發生的。你還是好好的去看看這方面的書吧。《C#高級編程》之類的書里都講的比較詳細。。。。
自己學習的時候做了一些筆記,希望對你有幫助
當一個類已經很好的同步以保護它的數據時,這個類就稱為「線程安全的」---我沒有跑題...
5.線程的同步與死鎖
1.什麼是同步
通過synchronized關鍵字標識方法或者代碼塊,限制線程對其內容的操作(同步詳細介紹參見 .)
2.為什麼要同步
java允許多線程並發控制,當多個線程同時操作一個可共享的資源變數時(如數據的增刪改查),
將會導致數據不準確,相互之間產生沖突,因此加入同步鎖以避免在該線程沒有完成操作之前,被其他線程的調用,
從而保證了該變數的唯一性和准確性.
3.進行同步的格式
同步代碼塊
synchronized (同步的線程對象){
需要同步的代碼塊;
}
同步方法
synchronized 其他訪問修飾符返回值方法名稱(){
方法內容
}
(synchronized也可以修飾靜態方法,此時如果調用該靜態方法,將會鎖住整個類)
4.什麼是死鎖
死鎖是進程死鎖的簡稱,是指多個進程循環等待它方佔有的資源而無限期地僵持下去的局面。它是計算機操作系統乃至並發程序設計中最難處理的問題之一
死鎖的解決
(死鎖詳細介紹參見進程死鎖及解決辦法.docx)
5.注意點
1.同步是一種高開銷的操作,因此應該盡量減少同步的內容。
通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可。
5. 如何解決java中線程安全問題
java中,線程安全的解決方法或過程:
1.如果對象是immutable,則是線程安全的,例如:String,可以放心使用。
2. 如果對象是線程安全的,則放心使用。
3.有條件線程安全,對於Vector和Hashtable一般情況下是線程安全的,但是對於某些特殊情況,需要通過額外的synchronized保證線程安全。
4.使用synchronized關鍵字。
6. 如何創建線程如何保證線程安全
不可變 在java語言中,不可變的對象一定是線程安全的,無論是對象的方法實現還是方法的...
2.絕對線程安全 絕對的線程安全完全滿足Brian GoetZ給出的線程安全的定義,這個定義...
3.相對線程安全 相對線程安全就是我們通常意義上所講的一個類是「線程安全」的。 它需要保證對...
4.線程兼容 線程兼容就是我們通常意義上所講的一個類不是線程安全的。 線程兼容是指對象本身並...
7. 如何保證線程安全
1、不可變
在java語言中,不可變的對象一定是線程安全的,無論是對象的方法實現還是方法的調用者,都不需要再採取任何的線程安全保障措施。如final關鍵字修飾的數據不可修改,可靠性最高。
2、絕對線程安全
絕對的線程安全完全滿足Brian GoetZ給出的線程安全的定義,這個定義其實是很嚴格的,一個類要達到「不管運行時環境如何,調用者都不需要任何額外的同步措施」通常需要付出很大的代價。
3、相對線程安全
相對線程安全就是我們通常意義上所講的一個類是「線程安全」的。
它需要保證對這個對象單獨的操作是線程安全的,我們在調用的時候不需要做額外的保障措施,但是對於一些特定順序的連續調用,就可能需要在調用端使用額外的同步手段來保證調用的正確性。
在java語言中,大部分的線程安全類都屬於相對線程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保證的集合。
4、線程兼容
線程兼容就是我們通常意義上所講的一個類不是線程安全的。
線程兼容是指對象本身並不是線程安全的,但是可以通過在調用端正確地使用同步手段來保證對象在並發環境下可以安全地使用。Java API中大部分的類都是屬於線程兼容的。如與前面的Vector和HashTable相對應的集合類ArrayList和HashMap等。
5、線程對立
線程對立是指無論調用端是否採取了同步錯誤,都無法在多線程環境中並發使用的代碼。由於java語言天生就具有多線程特性,線程對立這種排斥多線程的代碼是很少出現的。
一個線程對立的例子是Thread類的supend()和resume()方法。如果有兩個線程同時持有一個線程對象,一個嘗試去中斷線程,另一個嘗試去恢復線程,如果並發進行的話,無論調用時是否進行了同步,目標線程都有死鎖風險。正因此如此,這兩個方法已經被廢棄啦。
8. 保證線程安全的方法
線程(Thread),有時被稱為輕量級進程(LWP),是程序執行流的最小單位;一個標準的線程由線程ID、當前指令指針(PC)、寄存器集合和堆棧組成。通常情況下,一個進程由一個到多個線程組成,各個線程之間共享程序的內存空間及一些進程級的資源。
在大多數軟體應用中,線程的數量都不止一個,多線程程序處在一個多變的環境中,可訪問的全局變數和堆數據隨時都可能被其他的線程改變,這就將「線程安全」的問題提上了議程。那麼,如何確保線程的安全呢?
線程安全
一般說來,確保線程安全的方法有這幾個:競爭與原子操作、同步與鎖、可重入、過度優化。
競爭與原子操作
多個線程同時訪問和修改一個數據,可能造成很嚴重的後果。出現嚴重後果的原因是很多操作被操作系統編譯為匯編代碼之後不止一條指令,因此在執行的時候可能執行了一半就被調度系統打斷了而去執行別的代碼了。一般將單指令的操作稱為原子的(Atomic),因為不管怎樣,單條指令的執行是不會被打斷的。
因此,為了避免出現多線程操作數據的出現異常,Linux系統提供了一些常用操作的原子指令,確保了線程的安全。但是,它們只適用於比較簡單的場合,在復雜的情況下就要選用其他的方法了。
同步與鎖
為了避免多個線程同時讀寫一個數據而產生不可預料的後果,開發人員要將各個線程對同一個數據的訪問同步,也就是說,在一個線程訪問數據未結束的時候,其他線程不得對同一個數據進行訪問。
同步的最常用的方法是使用鎖(Lock),它是一種非強制機制,每個線程在訪問數據或資源之前首先試圖獲取鎖,並在訪問結束之後釋放鎖;在鎖已經被佔用的時候試圖獲取鎖時,線程會等待,直到鎖重新可用。
二元信號量是最簡單的一種鎖,它只有兩種狀態:佔用與非佔用,它適合只能被唯一一個線程獨占訪問的資源。對於允許多個線程並發訪問的資源,要使用多元信號量(簡稱信號量)。
可重入
一個函數被重入,表示這個函數沒有執行完成,但由於外部因素或內部因素,又一次進入該函數執行。一個函數稱為可重入的,表明該函數被重入之後不會產生任何不良後果。可重入是並發安全的強力保障,一個可重入的函數可以在多線程環境下放心使用。
過度優化
在很多情況下,即使我們合理地使用了鎖,也不一定能夠保證線程安全,因此,我們可能對代碼進行過度的優化以確保線程安全。
我們可以使用volatile關鍵字試圖阻止過度優化,它可以做兩件事:第一,阻止編譯器為了提高速度將一個變數緩存到寄存器而不寫回;第二,阻止編譯器調整操作volatile變數的指令順序。
在另一種情況下,CPU的亂序執行讓多線程安全保障的努力變得很困難,通常的解決辦法是調用CPU提供的一條常被稱作barrier的指令,它會阻止CPU將該指令之前的指令交換到barrier之後,反之亦然。
9. Java中如何保證線程安全性
並發(concurrency)一個並不陌生的詞,簡單來說,就是cpu在同一時刻執行多個任務。
而Java並發則由多線程實現的。
在jvm的世界裡,線程就像不相乾的平行空間,串列在虛擬機中。(當然這是比較籠統的說法,線程之間是可以交互的,他們也不一定是串列。)
多線程的存在就是壓榨cpu,提高程序性能,還能減少一定的設計復雜度(用現實的時間思維設計程序)。
這么說來似乎線程就是傳說中的銀彈了,可事實告訴我們真正的銀彈並不存在。
多線程會引出很多難以避免的問題, 如死鎖,臟數據,線程管理的額外開銷,等等。更大大增加了程序設計的復雜度。
但他的優點依舊不可替代。
死鎖和臟數據就是典型的線程安全問題。
簡單來說,線程安全就是:在多線程環境中,能永遠保證程序的正確性。
只有存在共享數據時才需要考慮線程安全問題。
java內存區域:
其中,方法區和堆就是主要的線程共享區域。那麼就是說共享對象只可能是類的屬性域或靜態域。
了解了線程安全問題的一些基本概念後, 我們就來說說如何解決線程安全問題。我們來從一個簡單的servlet示例來分析:
1. 了解業務場景的線程模型
這里的線程模型指的是: 在該業務場景下, 可能出現的線程調用實況。
眾所周知,Servlet是被設計為單實例,在請求進入tomcat後,由Connector建立連接,再講請求分發給內部線程池中的Processor,
此時Servlet就處於一個多線程環境。即如果存在幾個請求同時訪問某個servlet,就可能會有幾個線程同時訪問該servlet對象。如圖:
線程模型,如果簡單的話,就在腦海模擬一下就好了,復雜的話就可以用紙筆或其他工具畫出來。
2. 找出共享對象
這里的共享對象就很明顯就是ReqCounterServlet。
3. 分析共享對象的不變性條件
不變性條件,這個名詞是在契約式編程的概念中的。不變性條件保證類的狀態在任何功能被執行後都保持在一個可接受的狀態。
這里可以引申出,不可變對象是線程安全的。(因為不可變對象就沒有不變性條件)
不變性條件則主要由對可變狀態的修改與訪問構成。
這里的servlet很簡單, 不變性條件大致可以歸納為: 每次請求進入時count計數必須加一,且計數必須正確。
在復雜的業務中, 類的不變性條件往往很難考慮周全。設計的世界是險惡的,只能小心謹慎,用測量去證明,最大程度地減少錯誤出現的幾率。
4. 用特定的策略解決線程安全問題。
如何解決的確是該流程的重點。目前分三種方式解決:
第一種,修改線程模型。即不在線程之間共享該狀態變數。一般這個改動比較大,需要量力而行。
第二種,將對象變為不可變對象。有時候實現不了。
第三種,就比較通用了,在訪問狀態變數時使用同步。 synchronized和Lock都可以實現同步。簡單點說,就是在你修改或訪問可變狀態時加鎖,獨占對象,讓其他線程進不來。
這也算是一種線程隔離的辦法。(這種方式也有不少缺點,比如說死鎖,性能問題等等)
其實有一種更好的辦法,就是設計線程安全類。《代碼大全》就有提過,問題解決得越早,花費的代價就越小。
是的,在設計時,就考慮線程安全問題會容易的多。
首先考慮該類是否會存在於多線程環境。如果不是,則不考慮線程安全。
然後考慮該類是否能設計為不可變對象,或者事實不可變對象。如果是,則不考慮線程安全
最後,根據流程來設計線程安全類。
設計線程安全類流程:
1、找出構成對象狀態的所有變數。
2、找出約束狀態變數的不變性條件。
3、建立對象狀態的並發訪問管理策略。
有兩種常用的並發訪問管理策略:
1、java監視器模式。 一直使用某一對象的鎖來保護某狀態。
2、線程安全委託。將類的線程安全性委託給某個或多個線程安全的狀態變數。(注意多個時,這些變數必須是彼此獨立,且不存在相關聯的不變性條件。)
10. java 程序中怎麼保證多線程的運行安全
零基礎學習java可按照這份大綱來進行學習
第一階段:Java專業基礎課程
階段目標:
1. 熟練掌握Java的開發環境與編程核心知識
2. 熟練運用Java面向對象知識進行程序開發
3. 對Java的核心對象和組件有深入理解
4. 熟練應用JavaAPI相關知識
5. 熟練應用JAVA多線程技術
6. 能綜合運用所學知識完成一個項目
知識點:
1、基本數據類型,運算符,數組,掌握基本數據類型轉換,運算符,流程式控制制。
2、數組,排序演算法,Java常用API,類和對象,了解類與對象,熟悉常用API。
3、面向對象特性,集合框架,熟悉面向對象三大特性,熟練使用集合框架。
4、IO流,多線程。
5、網路協議,線程運用。
第二階段:JavaWEB核心課程
階段目標:
1. 熟練掌握資料庫和MySQL核心技術
2. 深入理解JDBC與DAO資料庫操作
3. 熟練運用JSP及Servlet技術完成網站後台開發
4. 深入理解緩存,連接池,註解,反射,泛型等知識
5. 能夠運用所學知識完成自定義框架
知識點:
1、資料庫知識,範式,MySQL配置,命令,建庫建表,數據的增刪改查,約束,視圖,存儲過程,函數,觸發器,事務,游標,建模工具。
2、深入理解資料庫管理系統通用知識及MySQL資料庫的使用與管理。為Java後台開發打下堅實基礎。Web頁面元素,布局,CSS樣式,盒模型,JavaScript,jQuery。
3、掌握前端開發技術,掌握jQuery。
4、Servlet,EL表達式,會話跟蹤技術,過濾器,FreeMarker。
5、掌握Servlet相關技術,利用Servlet,JSP相關應用技術和DAO完成B/S架構下的應用開發。
6、泛型,反射,註解。
7、掌握JAVA高級應用,利用泛型,註解,枚舉完成自己的CRUD框架開發為後續框架學習做鋪墊。
8、單點登錄,支付功能,項目整合,分頁封裝熟練運用JSP及Servlet核心知識完成項目實戰。
第三階段:JavaEE框架課程
階段目標:
1. 熟練運用Linux操作系統常見命令及完成環境部署和Nginx伺服器的配置
2. 熟練運用JavaEE三大核心框架:Spring,SpringMVC,MyBatis
3. 熟練運用Maven,並使用SpringBoot進行快速框架搭建
4. 深入理解框架的實現原理,Java底層技術,企業級應用等
5. 使用Shiro,Ztree和Spring,SpringMVC,Myts完成企業項目
知識點:
1、Linux安裝配置,文件目錄操作,VI命令,管理,用戶與許可權,環境部署,Struts2概述,hiberante概述。
2、Linux作為一個主流的伺服器操作系統,是每一個開發工程師必須掌握的重點技術,並且能夠熟練運用。
3、SSH的整合,MyBatis,SpringMVC,Maven的使用。
4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。
5、Shiro,Ztree,項目文檔,項目規范,需求分析,原型圖設計,資料庫設計,工程構建,需求評審,配置管理,BUG修復,項目管理等。
6、獨立自主完成一個中小型的企業級綜合項目的設計和整體架構的原型和建模。獨立自主完成一個大型的企業級綜合項目,並具備商業價值