Synchronize 與 JAVA 記憶體模型

來源:互聯網
上載者:User
每個JAVA對象都有一把所, 當有多個線程同時訪問共用資源的時候, 需要Synchronize 來控制安全性, synchronize 分 synchronize 方法 和synchronize快,使用synchronize塊時, 一定要顯示的獲得該對象的鎖(如synchronize(object))而方法則不需要。

JAVA 的記憶體模型是對每一個進程有一個主記憶體, 每個線程有自己的記憶體, 他們從主記憶體中取資料, 然後計算, 再存入主記憶體中。 

並發問題如下:如果多個線程同事操作同一資料, A線程從主記憶體中取的I的值為1, 然後進行加1操作, 這時B線程也取I的值, 進行加2操作, 然後A存入2到主記憶體中, B也存入, 這樣就覆蓋了A的值(同資料庫中的並發問題一樣)。

解決辦法是用synchronize, 如用synchronized(I)。被synchronize 修飾的方法(塊)把以下三步操作當成一個原子操作:取資料, 操作資料, 存資料。 我們知道原子操作是不可以被打斷的, 所以其保證了資料一致性, 這樣同一時間只有一個線程再執行, 對效能有一定的影響。這也是synchronize的第二個作用:保證統一時間只有一個線程再運行。 當實現SOCKET串連的時候經常用到.

JAVA中規定對非FLOAT, LONG的原始類型的取和存操作為原子操作。 其實就是對一個字(32位)的取,存位原始操作, 因為FLOAT, LONG為兩個位元組的長度, 所以其取, 存為非原子操作。 如果想把他們也變為原子操作, 可以用VOLATILE關鍵字來修飾。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.