線程安全問題

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

  首先,線程安全就是在多線程的狀況下,若是對於一個共享變量的使用產生的結果是惟一肯定的,那麼便認爲是線程安全!!!緩存

  那麼在多線程的狀況下,要想對一個共享的變量保證其爲線程安全,則簡單粗暴的方法就是對其操做的時候進行加鎖,就是當一個線程佔有此變量的時候不容許其餘的線程對他進行操做,必須等到此線程對改變成的修改完成以後方能由其餘變量對他進行操做。安全

  還有一種就是cas,這傢伙就是一個線程開始取了共享變量做爲一個預期值,當要用的時候再看一下內存裏的該變量是否與上次的預期值同樣,當發現同樣的時候,它就認爲沒有線程和我一塊兒玩這個變量,我就能夠對他進行操做,而且它此時對共享變量進行操做的時候利用的是lock總線鎖,從最底層保證了原子性;而當他發現內存裏面的值和原來取出來的預期值不同時,就認爲有線程對此變量進行操做了,則放棄這次操做,而且更新預期值,再重複以上操做直至完成。多線程

  至於volatile,這傢伙就是保證了共享變量在各個線程之間的可見性,例如內存中的i = 1;其中兩線程對 i 進行了讀取操做,而後其中一個將 i 變爲2;當 i 由volatile修飾的時候,內存和另外一個線程中的 i 就會做廢,並更新爲新的 i ,和緩存的操做差很少,可是這個關鍵字只能保證可見性,而不能保證原子性,好比 i++ 這個語句實際上是由三步組成的:將 i 取出,對它進行++操做,將操做後的 i 放回;而volitile是不能保證這三步一塊兒完成,即當你取出來尚未進行++操做的時候可能別的線程又拿到了 i 並對他進行了操做,這樣 i 的結果就不肯定了,即保證不了安全性線程

相關文章
相關標籤/搜索