java併發之原子性

2021-09-01 17:38:34 字數 924 閱讀 4471

詳見:[url]

1、原子性操作:

不能被執行緒排程機制中斷的操作;--對原子性變數的賦值和返回操作通常都是原子性的

原子性可以用於除了long和double之外的所有基本型別上的簡單操作(當做不可分的原子),但是jvm將64位的 (long 和double變數)讀取和寫入當成是兩個分離的32位 操作來執行。

2、同步機制與可視性:

同步機制強制在處理器系統中,乙個任務做出的修改必須在應用中是可視的,如果沒有同步機 制,那麼修改時可視性將無法確定。

3、關於volatile:

(1)當你定義long或者double的時候,如果使用volatile關鍵字,就會獲得原子性(jdk 1.5之前不支援)

(2)volatile關鍵字還確保了應用中的可視性。

(3)當乙個域的值依賴於他之前的值時(比如說自增)volatile就無法工作了。

(4)如果乙個域的值受到其他域的值得限制,那麼volatile也就無法工作了--例如range類的lower和upper邊界就必須遵守lower<=upper。

4、volatile、synchronized和主存:

(1)如果你將乙個域宣告為volatile,只要對這麼域近些了寫操作,那麼所有的讀操作都可以看到這個修改,即便使用了本地快取,情況也確實如此,volatile域會立即寫入到主存中,而讀操作就發生在主存中。

(2)在非volatile域上的原子操作不必重新整理到主存中去,因此其他讀取該域的任務也不必看到該新值。

(3)同步也會導致向主存中重新整理,因此乙個域如果完全由synchronized方法或者語句塊來保護,那就不必將其設定為volatile。

(4)乙個任務進行的任何寫入操作對於這個任務本生都是可視的。

(5)使用volatile而不是synchronized唯一安全的情況就是類中只有乙個可變的域。--實現同步第一選擇應該是synchronized。

java併發 原子性和可見性(7)

原子性 某個操作同時只能由乙個執行緒執行。可見性 乙個執行緒的修改對其他執行緒是可見的。也就是a執行緒修改了變數x,那麼b,c,d.執行緒此時去拿到的x肯定是a修改之後的值。package com.concurenny.chapter.six public class atomicitydemo s...

Redis 併發原子性原理

redis原子性原理 摘要 1 redis是單程序單執行緒的網路模型,用的是epoll網路模型,網路模型都是單執行緒非同步非阻塞處理網路請求 2 redis的單執行緒處理所有的客戶端連線請求,命令讀寫請求。有些任務比如rdb和aof等操作是fork子程序處理的,不會影響redis主線程處理客戶端的命...

java併發程式設計基礎 原子類與原子更新

1 什麼是原子類 原子類可以認為其操作都是不可分割 2 為什麼要有原子類 對多執行緒訪問同乙個變數,我們需要加鎖,而鎖是比較消耗效能的,jdk1.5之後,新增的原子操作類提供了一種用法簡單 效能高效 執行緒安全地更新乙個變數的方式,這些類同樣位於juc包下的atomic包下,發展到jdk1.8,該包...