java線程安全-java併發編程實踐

        編寫線程安全的代碼,本質上就是管理對狀態的訪問,並且一般是共享的、可變的狀態java

        通俗地說,一個對象的狀態就是它的數據,存儲在狀態變量中,好比實例域或靜態域。對象的狀態還包括了其餘附屬對象域。例如,HashMap的狀態一部分存儲到對象自己中,但同時也存儲到不少Map.Entry對象中。一個對象的狀態包含了任何對它外部可見行爲產生影響的數據。安全

        所謂共享,是指一個變量能夠被多個線程訪問;所謂可變,是指變量的值在其生命週期內能夠改變。咱們討論的線程安全性好像是關於代碼的,可是咱們真正要作的,是在不可控制的併發訪問中保護數據
併發

        一個對象是否應該是線程安全的,取決於它是否會被多個線程訪問。線程安全的這個性質,取決於程序中如何使用對象 ,而不是對象完成了什麼。保證對象的線程安全性須要使用同步協調對其可變狀態的訪問;如果作不到這一點,就會致使髒數據和其餘不可預期的後果。
spa

        不管什麼時候,只要有多於一個線程訪問給定的狀態變量,並且其中某個線程會寫入該變量,此時必須使用同步來協調線程對該變量的訪問。java中首要的同步機制是synchronized關鍵字,它提供了獨佔鎖。除此以外,術語」同步「還包括
線程

volatile變量,顯示鎖和原子變量的使用。對象

 在沒有正確同步的狀況下,若是多個線程訪問了同一個變量,你的程序就存在隱患。有3種方法修復它:生命週期

  • 不要跨線程共享變量。同步

  • 使狀態變量爲不可變的;或者變量

  • 在任何訪問狀態的時候使用同步。   程序

相關文章
相關標籤/搜索