1. 程式人生 > >什麼是執行緒安全和執行緒不安全

什麼是執行緒安全和執行緒不安全

首先要明白執行緒的工作原理,jvm有一個main   memory,而每個執行緒有自己的working   memory,一個執行緒對一個variable進行操作時,都要在自己的working   memory裡面建立一個copy,操作完之後再寫入main   memory。多個執行緒同時操作同一個variable,就可能會出現不可預知的結果。根據上面的解釋,很容易想出相應的scenario。 
而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method,然後通過給這個monitor加鎖來實現執行緒安全,每個執行緒在獲得這個鎖之後,要執行完   load到workingmemory   ->   use&assign   ->   store到mainmemory   的過程,才會釋放它得到的鎖。這樣就實現了所謂的執行緒安全。

------------------------------------------------------

什麼是執行緒安全?執行緒安全是怎麼完成的(原理)? 
執行緒安全就是說多執行緒訪問同一程式碼,不會產生不確定的結果。編寫執行緒安全的程式碼是低依靠執行緒同步。

------------------------------------------------------

在介面方式中,執行緒有一個共享的資料成員,即: private   int   count   =10; 
而在繼承方式中,執行緒之間沒有共享的成員,而是各執行緒各自有一個私有成員,即: private   int   count   =10; 
樓主的程式碼剛好是一個好例子,說明了何時需要考慮執行緒同步,並在一定程式上說明了怎樣才能編寫出執行緒安全的程式碼。 
在多執行緒環境中,當各執行緒不共享資料的時候,那麼一定是執行緒安全的。問題是這種情況並不多見,在多數情況下需要共享資料,這時就需要進行適當的同步控制了。

--------------------------------------------------------

執行緒安全一般都涉及到synchronized 就是一段程式碼同時只能有一個執行緒來操作 不然中間過程可能會產生不可預製的結果

---------------------------------------------------------

如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。

舉例 比如一個 ArrayList 類,在新增一個元素的時候,它可能會有兩步來完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

在單執行緒執行的情況下,如果 Size = 0,新增一個元素後,此元素在位置 0,而且 Size=1; 而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 A 先將元素存放在位置 0。但是此時 CPU 排程執行緒A暫停,執行緒 B 得到執行的機會。執行緒B也向此 ArrayList 新增元素,因為此時 Size 仍然等於 0 (注意哦,我們假設的是新增一個元素是要兩個步驟哦,而執行緒A僅僅完成了步驟1),所以執行緒B也將元素存放在位置0。然後執行緒A和執行緒B都繼續執行,都增加 Size 的值。 那好,現在我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等於 2。這就是“執行緒不安全”了。

相關推薦

線程安全線程安全

software counter 模擬 tor int bject ase tle 什麽是 ArrayList和Vector有什麽區別?HashMap和HashTable有什麽區別?StringBuilder和StringBuffer有什麽區別?這些都是Java面試中常見的

什麼是執行安全執行安全

首先要明白執行緒的工作原理,jvm有一個main   memory,而每個執行緒有自己的working   memory,一個執行緒對一個variable進行操作時,都要在自己的working   memory裡面建立一個copy,操作完之後再寫入main   memory。多個執行緒同時操作同一個varia

執行安全執行安全的區別

程序和執行緒: 1)程序是靜態的,其實就是指開啟的一個程式;而執行緒是動態的,是真正執行的單元,執行的過程。其實我們平時看到的程序,是執行緒在執行著,因為執行緒是作為程序的一個單元存在的。 2)同樣作為基本的執行單元,執行緒是劃分得比程序更小的執行單位。 3)每個程

執行同步執行安全

執行緒同步 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。 “同”字從字面上容易理解為一起動作,其實不是,“同”字應是指協同、協助、互相配合。 如程序、執行緒同步,可理解為程序或執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下

執行安全執行同步Synchronized

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。 執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後

執行退出執行資源回收問題

最近專案中遇到迴圈8M的記憶體洩漏問題,排查後發現是由於特殊場景下使子執行緒異常退出,主執行緒發現子執行緒退出便再次建立執行緒,此時未回收退出執行緒的資源造成了記憶體洩漏,導致資料庫宿主機oom,此問題不僅導致記憶體洩漏,還會使執行緒控制代碼用完導致其他程序無法分配執行緒的風險。 下面來

Java——多執行基本使用(四) 執行執行池的使用,工廠設計模式的使用

1.執行緒組的概述和使用 Java中使用ThreadGroup來表示執行緒組,它可以對一批執行緒進行分類管理,Java允許程式直接對執行緒組進行控制。            &n

執行概述、執行控制執行私有資料

一、執行緒概述   在許多經典的作業系統教科書中,總是把程序定義為程式的執行例項,它並不執行什麼, 只是維護應用程式所需的各種資源,而執行緒則是真正的執行實體。在一個程序中的多個執行路線叫做執行緒。為了

執行執行相關類

執行緒池概述 系統啟用一個新執行緒的成本是比較高的,因為它涉及與作業系統互動。在這種情形下,使用執行緒池可以很好的提高效能。執行緒池在系統啟動時即建立大量空閒的執行緒,程式將一個Runnable物件或Callable物件傳給執行緒池,執行緒池會啟動一個執行緒來執行它們的run()或call方

控制執行(NSThread)執行時迴圈(NSRunLoop)的退出

原文地址:http://shaheengandhi.com/controlling-thread-exit/ 這是講iOS的執行緒的文章,下面的內容,自己都慘不忍睹啊,哈哈,練習翻譯一下文章,英語太差啊,儘量止步吧。。。。 ------------------------

Java 執行執行池區別

執行緒組: 執行緒組存在的意義,首要原因是安全。 java預設建立的執行緒都是屬於系統執行緒組,而同一個執行緒組的執行緒是可以相互修改對方的資料的。 但如果在不同的執行緒組中,那麼就不能“跨執行緒組”

執行簡介執行優先順序

1.執行緒 執行緒:又稱輕量級程序,是現代作業系統的最小排程單元。JAVA從誕生開始就明智的選擇了內建對多執行緒的支援。 在一個程序中可以建立多個執行緒,這些執行緒擁有各自的計數器、堆疊和區域性變數等特性,並且能夠訪問共享的記憶體變數。在JVM中,我們也可以

Java自定義執行執行總數控制

1 概述池化是常見的思想,執行緒池是非常典型的池化的實現,《Java併發程式設計實戰》也大篇幅去講解了Java中的執行緒池。本文實現一個簡單的執行緒池。 2 核心類 【1】介面定義 public interface IThreadPool<Job extends

關於Java多執行執行同步執行通訊的一些小問題(順便分享幾篇高質量的博文)

一、對於執行緒同步和同步鎖的理解(注:分享了三篇高質量的部落格) 以下我精心的挑選了幾篇博文,分別是關於對執行緒同步的理解和如何選擇執行緒鎖以及瞭解執行緒鎖的作用範圍。 <一>執行緒同步鎖的選擇 2. 以上推薦的博文是以賣火車票為例,引出了非同步會導致的錯誤以及同步鎖(監視器)應該如果選擇,

Java使用執行執行工廠

package com.uno.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.u

黑馬程式設計師_基礎加強_Java執行通訊執行併發庫

 ------- android培訓、java培訓、期待與您交流! ---------- java5的執行緒鎖技術 Lock&Condition實現執行緒同步通訊 Lock比傳統的synchronized方式更加面向物件,兩個執行緒執行的程式碼塊要實現同步互斥,

java 執行環境版本編譯版本匹配

2015-06-01 周海漢2015.6.1 兒童節快樂! Caused by: java.lang.UnsupportedClassVersionError: com/xxx/Global : Unsupported maj

java-線程安全非線程安全區別理解

java1. ArrayList:底層是數組結構,查詢快,增刪慢 LinkedList:底層結構是鏈表,查詢慢,增刪快2. 線程安全和非線程安全 非線程安全是指多線程操作同一個對象可能會出現問題。 線程安全是多線程操作同一個對象不會有問題。 線程安全必須要使用很多synchronized關鍵

java 執行安全安全

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。(Vector,HashTab;le) 執行緒不安全就是不提供資

JDK7JDK8中HashMap的資料結構以及執行安全無序

JDK7中HashMap實現jdk7中HashMap的資料結構是陣列+連結串列來實現的,底層維護著一個數組,每個陣列項是一個Entry;transient Entry<K,V>[] table;static class Entry<K,V> imple