執行緒安全問題

2022-09-03 10:03:11 字數 753 閱讀 4661

今天面試被問到執行緒安全,咋一愣,有點懵,一時間竟不知道講點啥,回來好好總結了一下;

首先,執行緒安全就是在多執行緒的情況下,如果對於乙個共享變數的使用產生的結果是唯一確定的,那麼便認為是執行緒安全!!!

那麼在多執行緒的情況下,要想對乙個共享的變數保證其為執行緒安全,則簡單粗暴的方法就是對其操作的時候進行加鎖,就是當乙個執行緒占有此變數的時候不允許其他的執行緒對他進行操作,必須等到此執行緒對改變成的修改完成之後方能由其他變數對他進行操作。

還有一種就是cas,這傢伙就是乙個執行緒開始取了共享變數作為乙個預期值,當要用的時候再看一下記憶體裡的該變數是否與上次的預期值一樣,當發現一樣的時候,它就認為沒有執行緒和我一起玩這個變數,我就可以對他進行操作,並且它此時對共享變數進行操作的時候利用的是lock匯流排鎖,從最底層保證了原子性;而當他發現記憶體裡面的值和原來取出來的預期值不一樣時,就認為有執行緒對此變數進行操作了,則放棄此次操作,並且更新預期值,再重複以上操作直至完成。

至於volatile,這傢伙就是保證了共享變數在各個執行緒之間的可見性,例如記憶體中的i = 1;其中兩線程對 i 進行了讀取操作,然後其中乙個將 i 變為2;當 i 由volatile修飾的時候,記憶體和另乙個執行緒中的 i 就會作廢,並更新為新的 i ,和快取的操作差不多,但是這個關鍵字只能保證可見性,而不能保證原子性,比如 i++ 這個語句其實是由三步組成的:將 i 取出,對它進行++操作,將操作後的 i 放回;而volitile是不能保證這三步一起完成,即當你取出來還沒有進行++操作的時候可能別的執行緒又拿到了 i 並對他進行了操作,這樣 i 的結果就不確定了,即保證不了安全性

執行緒安全問題

執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...

執行緒安全問題

是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...

執行緒安全問題

由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....