1. 程式人生 > >基於CAS執行緒安全實現計數器

基於CAS執行緒安全實現計數器

 在多執行緒環境下,實現一個CAS原理的執行緒安全的技術器,並與不使用CAS演算法的計數器進行比較。

package com.feiyu.text;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Created by 獵風工作室
 * @Author by 飛宇
 * @Date 2018/11/20 16:25
 */
public class Counter {
    private AtomicInteger atomicInteger = new AtomicInteger(0);
    private int i=0;

    public static void main(String[] args) {
        final Counter cas = new Counter();
        List<Thread> threadArrayList = new ArrayList<Thread>(600);
        long start = System.currentTimeMillis();
        for(int j=0;j<100;j++){
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    for(int i=0;i<10000;i++){
                        cas.count();
                        cas.safeCount();
                    }
                }
            });
            threadArrayList.add(thread);
        }
        for (Thread thread : threadArrayList){
            thread.start();
        }
        /**
         * 等待所有執行緒執行完成
         */
        for (Thread thread : threadArrayList){
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(cas.i);
        System.out.println(cas.atomicInteger.get());
        System.out.println(System.currentTimeMillis() - start);

    }

    /**
     * 使用CAS實現執行緒安全的計數器
     */
    private void safeCount() {
        for (;;){
            int i = atomicInteger.get();
            boolean suc = atomicInteger.compareAndSet(i,++i);
            if (suc){
                break;
            }
        }
    }

    /**
     * 非執行緒安全的計數器
     */
    private void count() {
        i++;
    }


}

結果如下:

我們分析可得,當在多執行緒環境下,為了實現原子操作,我們使用CAS。

當使用CAS時,得到的計數為正確的1000000,而未使用時,得到的卻是另一個結果,因為執行緒是競爭得到CPU處理時間片的,所以得到的計數也是不一樣的,但是卻肯定比執行緒安全時的少。

相關推薦

基於CAS執行安全實現計數器

 在多執行緒環境下,實現一個CAS原理的執行緒安全的技術器,並與不使用CAS演算法的計數器進行比較。 package com.feiyu.text; import java.util.ArrayList; import java.util.List; import jav

一個執行安全計數器實現(java),可以讓一個變數每天從1開始遞增

前幾天工作中一段業務程式碼需要一個變數每天從1開始遞增。為此自己簡單的封裝了一個執行緒安全的計數器,可以讓一個變數每天從1開始遞增。當然了,如果專案在執行中發生重啟,即便日期還是當天,還是會從1開始重新計數。所以把計數器的值儲存在資料庫中會更靠譜,不過這不影響這

單列模式之執行安全實現

單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態內部類、列舉   懶漢式執行緒不安全 public class Singleton { private static Singleton instance; private Singleton (){} publ

執行安全實現與 CLH 佇列

阻塞同步 在 Java 中,我們經常使用 synchronized 關鍵字來做到互斥同步以解決多執行緒併發訪問共享資料的問題。synchronzied 關鍵字在編譯後,會在 synchronized 所包含的同步程式碼塊前後分別加入 monitorenter 和 m

高併發下的執行安全實現——執行區域性變數

今天我們來討論另外一種執行緒安全的實現方法。如果說互斥同步是多執行緒間的資料共享,那麼執行緒區域性變數就是執行緒間的資料隔離。ThreadLocal把共享資料的可見範圍限制在同一個執行緒之內,這樣無須同步也能實現執行緒之間資料不爭用的問題。當使用ThreadLo

Java多執行執行安全實現方式

執行緒安全就是要保證資料的高度一致性和準確性,但不是一定要加鎖才是執行緒安全性,只要程式碼裡沒有變數互串,執行緒之間互不影響,就是執行緒安全的。 要了解執行緒安全,可以先看一下執行緒不安全是怎樣的一種

Java執行安全計數器

   一、多執行緒以及執行緒安全           java執行緒安全就是指控制多個執行緒對某個資源的有序訪問或修改。這涉及兩個很重要的概念:java的記憶體模型和java的執行緒同步機制。    

高併發下的執行安全實現——互斥同步

好久沒來csdn上寫部落格了,去年(16年)來到杭州後,忙得沉澱的時間都沒有了,這段時間空閒下來,慢慢補上! 執行緒允許多個活動同時進行,併發下有很多東西可能出錯,比如資料錯誤,程式執行異常。很多時候這些錯誤以及異常在測試中都很難重現,他們可能是間歇性的,且與

執行安全計數器類Counter

可向該計數器物件中新增物件,相等的物件(通過equals()方法比較是否相等)的個數被儲存。可獲取其中某個物件的個數,也可以獲取個數最多的物件及其個數。可用於多執行緒環境。如有不妥之處,歡迎指正。import java.util.*;public final class Co

Java多執行之—Synchronized方式和CAS方式實現執行安全效能對比

效能比較猜想 1.大膽假設 在設計試驗方法之前,針對Synchronized和CAS兩種方式的特點,我們先來思考一下兩種方式效率如何? 首先,我們在回顧一下兩種方式是如何保證執行緒安全的。Synchronized方式通過大家應該很熟悉,他的行為非常悲觀,只要有一個執行緒進

基於stl序列容器實現的通用集合類 (執行安全版)

{ 31    typedef U<T> Allocator; 32    typedef C<T,Allocator>base; 33    typedef STLCollection<T,ThreadModel,MutexPolicy,C,U> self; 34 35p

這裡實現一個基於陣列的執行安全的迴圈佇列

具體程式碼如下: #include<pthread.h> #include<iostream> using namespace std; #define QUEUESIZE 128 template<class object> cla

Qt中實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

設計模式之單例模式【內附物件例項化幾種方式、實現執行安全幾種方式】

繼續來複習常用的設計模式-單例模式,順便回憶一下執行緒安全的幾種實現方式。 一、什麼是單例模式 單例模式,簡單常用的一種設計模式,也很好的體現了程式碼控制物件在記憶體數量的一種方式,主要分2種實現方式: ①餓漢式,執行緒安全 ②懶漢式,執行緒不安全(新增鎖機制,可以實現執行緒安全)

JVM——執行安全實現方法

一互斥同步(悲觀的併發策略) 同步是指在多個執行緒併發訪問共享資料時,保證共享資料在同一時刻只被一個執行緒使用。互斥是實現同步的一種手段,下面介紹兩種互斥同步的手段:synchronized關鍵字和concurrent包中的重入鎖ReentrantLock synchronized關鍵字:

如何執行安全地實現一個計數器(不看後悔,看了必懂)

i++是執行緒安全的嗎   i++和++i的執行緒安全分為兩種情況: 1、如果i是區域性變數(在方法裡定義的),那麼是執行緒安全的。因為區域性變數是執行緒私有的,別的執行緒訪問不到,其實也可以說沒有執行緒安不安全之說,因為別的執行緒對他造不成影響。 2、如果i是全域性變

實現執行安全的3種方式

實現多執行緒安全的3種方式   1、先來了解一下:為什麼多執行緒併發是不安全的?   在作業系統中,執行緒是不擁有資源的,程序是擁有資源的。而執行緒是由程序建立的,一個程序可以建立多個執行緒,這些執行緒共享著程序中的資源。所以,當執行緒一起併發執行時,同時對一個數據進行修改,就

c/c++ 多執行 利用條件變數實現執行安全的佇列

多執行緒 利用條件變數實現執行緒安全的佇列 背景:標準STL庫的佇列queue是執行緒不安全的。 利用條件變數(Condition variable)簡單實現一個執行緒安全的佇列。 程式碼: #include <queue> #include <memory> #include

執行安全的Map的實現方式3種

1. HashMap,TreeMap 未進行同步考慮,是執行緒不安全的。 2. HashTable 和 ConcurrentHashMap 都是執行緒安全的。區別在於他們對加鎖的範圍不同,HashTable 對整張Hash表進行加鎖,而ConcurrentHashMap將Hash表分為16桶(s

基於執行通訊實現多生產者多消費者模式

前言: 執行緒開始執行,擁有自己的棧空間,但是如果每個執行中的執行緒,如果僅僅是孤立地執行,那麼沒有一點兒價值,或者是價值很小,如果多執行緒能夠相互配合完成工作的話,這將帶來巨大的價值,這也就是執行緒間的通訊啦。在java中多執行緒間的通訊使用的是等待/通知機制來實現的。 具體而言: