1. 程式人生 > >juc-----原子變數(atomic..)

juc-----原子變數(atomic..)

上一篇說到volatile只有記憶體可見行,沒有原子性。   juc為我們提供了一些原子變數。

----------------------程式碼舉例-------------------

package com.fjf.juc;


/**
 * i++  不具有原子性。 讀   修改  寫
 * 
 * volatile 能保證記憶體可見性,並不能保證原子性
 * @author Administrator
 *
 */
public class TestAtomic {
    public static void main(String[] args) {
        Atomictd atomictd = new Atomictd();
        for (int i = 0; i <10; i++) {
            new Thread(atomictd).start();
        }
    }
    
}

class  Atomictd implements Runnable{
    private volatile int num = 0;
    @Override
    public void run() {
    
    try {
        Thread.sleep(300);
        System.out.println(num++);
    } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
}

----------------

修改為原子變數後,可保證其原子性。

--------------

總結:

原子變數   1.利用volatile保證可見性2.利用cas演算法(compare-and-swap)來保證原子性。

相關推薦

juc-----原子變數atomic..

上一篇說到volatile只有記憶體可見行,沒有原子性。   juc為我們提供了一些原子變數。 ----------------------程式碼舉例------------------- package com.fjf.juc; /**  * i++  不具有原

原子操作Atomic

例如在單核系統裡,單個的機器指令可以看成是原子操作(如果有編譯器優化、亂序執行等情況除外);在多核系統中,單個的機器指令就不是原子操作,因為多核系統裡是多指令流並行執行的,一個核在執行一個指令時,其他核同時執行的指令有可能操作同一塊記憶體區域,從而出現數據競爭現象。多核系統中的原子操作通常使用記憶體柵障(me

C++11中的原子操作atomic operation

所謂的原子操作,取的就是“原子是最小的、不可分割的最小個體”的意義,它表示在多個執行緒訪問同一個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源。也就是他確保了在同一時刻只有唯一的執行緒對這個資源進行訪問。這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接

一鍵部署JDK環境變數windows

一、基礎知識 在重灌系統後,可能需要配置計算機的環境變數,在這裡以配置Java環境變數為例講解幾種配置方式。 1.SET命令:這種語法只能在Cmd Shell環境中有效,關閉執行環境環境變數將不儲存。 例子: @echo off set PATH=C:\Java\jdk1.8.0_3

PYTHON——多執行緒:條件變數Condition

  條件變數(Condition)也是一把鎖,除了同步鎖的作用外,還具有線上程間通訊的功能。   有一類執行緒需要滿足條件之後才能夠繼續執行,Python提供了threading.Condition 物件用於條件變數執行緒的支援,它除了能提供RLock()或Lock()的方法外,還提供了 wait()、no

引用變數&

參考: PHP引用的官方解釋 摘要: 引用變數概念:不同的名字訪問同一個變數內容 引用變數的定義方式:使用&符號 引用變數的優點:大陣列使用引用能夠節省大量的記憶體;引用可以寫出簡潔的程式碼; 一、引用變數基礎知識 Demo1 使用memory_get_us

使用setx 命令新增環境變數Windows

背景 用GUI的方法可能新增環境變數可能會比較麻煩,為此可採用命令列操作的方式。 步驟 以管理員身份執行 cmd 輸入 setx \M "path" "%path%[new_path];"。其中\M開關表示新增系統變數,由於%path%` 本身是系統變數和使用者變數拼起來的,不能用此方法新增使用者

Powershell-變數2

驅動器變數 直接訪問檔案路徑 通過驅動器訪問,必須將檔案路徑放置到"{}"中 變數作用域 $global:全域性變數 $script:指令碼變數 $private:私有變數,當前

Mac 環境變數Path

文章目錄 1、開啟終端 2、編輯環境變數 3、儲存環境變數 4、生效 系統版本: 如果其他版本有問題歡迎在評論裡留言。 1、開啟終端 輸入:vi ./.bash_profile 回車開啟.b

靜態方法和靜態變數總結

1.static方法是類中的一個成員方法,屬於整個類,即使不用建立任何物件也可以直接呼叫! static內部只能出現static變數和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是屬於整個類! 2.靜態方法效率上要比例項化高,靜態方法的缺點是不自動

5.C#基礎之變數完成

     上一篇寫了型別,這一片接著講型別宣告的變數,變量表示儲存位置。C#定義了七種變數類別:靜態變數、例項變數、陣列元素、值引數、引用引數、輸出引數和區域性變數。   5.1變數類別      靜態變數:用static修飾符宣告

變數C#

(~ o ~)~zZ 快樂學習~   Main 在C#中,每一個變數都有一個特定的型別。它的型別決定了變數的記憶體大小以及佈局,所以也可以認為,每一個變數是一個供程式操作的儲存區的名字。 C#中提供的基本的值型別大致可以分為以下幾類: 型別  

努力使失敗保持原子64

失敗的原子呼叫應該使得物件保持在被呼叫之前的狀態,所謂:失敗原子性 幾種途徑實現: 設計一個不可變物件,其失敗原子性是顯然的 對於可變引數,執行前檢查引數有效性 避免執行一半報錯,後續無法執行導致狀態不一致 調整計算順序,使得任何可能失敗的部

wpf繫結全域性靜態變數mvvm

原文 wpf繫結全域性靜態變數(mvvm) 在實際的開發中,有一些集合或者屬性可能是全域性的,比如當你做一個oa的時候,可能需要展示所有的人員,這時這個所有的人員列表顯然可以作為全域性引數,比如這裡有一個全域性的靜態屬性UserList。而你在使用mvvm做wpf開發的時候,一般每個view都已經

python 入門之變數

在學習一門語言的時候不可避免的要學習從他的最基礎的一些東西,本人一直從事前端工作,在前端的 JS 裡面,變數有三種,es5 的語法裡面的最原始的一種就是 var 關鍵詞,es6 裡面是 let 和 const 但是同樣也支援 es5 的語法變數 val ,但是在

Mac下配置環境變數

說明:Mac下一般使用bash作為預設shell 一、Mac系統的環境變數,載入順序為: /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 當然/etc/profile和/etc/paths是系

淺談ArcGIS移動開發中的基本變數1:MapView、Map、Layers、GraphicsOverlay

一、MapView  二、Map        Map,程式設計中即ArcGISMap,可譯為地圖物件,主要用來承載地圖資料,ArcGISMap包含製圖資料圖層以及其它能夠定義地圖資訊的資料(例如basemaps底圖、popups彈出視窗、renderer渲染

jmeter函式和變數

概述 對jmeter函式進行一次全面複習,依據是官網的文件版本3.2。本來想一篇寫完的,中間做專案和一些雜事拖了2個禮拜,再回來寫的時候發現太長了~還是分開寫比較妥當。先放出一部分吧。 函式和變數 JMeter函式是一種特殊的值,可以在測試樹中填充任何

Windows-新增環境變數path

使用命令提示符((cmd)(批處理)(Batch)(.bat))新增環境變數 永久環境變數 命令提示符下修改 ==注意:要使用管理員身份執行cmd== set PATH=%PATH%;要新增的路徑 reg add "HKLM\SYSTEM\CurrentControlSet\Control\Sessi

JUC同步鎖

根據鎖的新增到Java中的時間,Java中的鎖,可以分為“同步鎖”和“JUC包中的鎖”。 一、同步鎖--synchronized關鍵字 通過synchronized關鍵字來進行同步,實現對競爭資源的互斥訪問的鎖。 同步鎖的原理是,對於每一個物件,有且僅有一個同步鎖;不同的執行緒能共同訪問該同步