Synchronize 與 JAVA 內存模型

          每個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關鍵字來修飾。

          posted on 2006-10-26 19:19 Sheldon Sun 閱讀(412) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 金溪县| 绥宁县| 刚察县| 荣昌县| 呼图壁县| 千阳县| 鱼台县| 清涧县| 息烽县| 光泽县| 牡丹江市| 托克逊县| 当雄县| 辉南县| 黄冈市| 农安县| 衢州市| 台东县| 北票市| 京山县| 天峻县| 农安县| 江陵县| 八宿县| 香港| 西畴县| 石景山区| 南城县| 五河县| 罗源县| 珠海市| 名山县| 海晏县| 大方县| 潜江市| 静海县| 六枝特区| 京山县| 星子县| 睢宁县| 谷城县|