基於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中多執行緒間的通訊使用的是等待/通知機制來實現的。 具體而言: