安全執行緒和線程不安全

來源:互聯網
上載者:User

如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程啟動並執行結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是安全執行緒的。 
  或者說:一個類或者程式所提供的介面對於線程來說是原子操作或者多個線程之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。
  安全執行緒問題都是由全域變數及靜態變數引起的。
  若每個線程中對全域變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域變數是安全執行緒的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響安全執行緒。       安全執行緒就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個資料時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現資料不一致或者資料汙染。 
線程不安全就是不提供資料訪問保護,有可能出現多個線程先後更改資料造成所得到的資料是髒資料。

比如說,兩個線程操作同一個ArrayList變數,那麼一個線程這一時刻讀的資料可能在下一刻要改變。

一般在類似於下面的情景下考慮安全執行緒的問題:

ArrayList products=new ArrayList ();
products用來存放生產出來的產品。
現在假設:有3個消費者線程,2個生產者線程。
每個生產者線程生產出一個產品,執行
products.add(new Product());
每個消費者線程消費一個產品執行
if(products.size()>=1){ products.remove(0);}

如果products裡現在只有一個產品可以消費,但是有2個消費者線程請求消費,那麼就有可能出現一個產品被同時消費的問題,而這是和實際不符的。

但是不同的線程訪問Vector的時候不會發生這種錯誤,因為java會有相應的機制是同一時刻只有一個線程對這個變數操作。

那麼:

Vector:是安全執行緒的

ArrayList:不是安全執行緒的


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.