今天寫代碼,嘗試使用了AtomicInteger這個類,感受使用起來很爽,特別適用於高併發訪問,下面貼一個簡單的例子:java
使用場景:面試
由於經過WS服務獲取MobileCashierViewModel 這個對象比較頻繁,會很影響系統資源,能夠將cvm存入緩存中,想要查看緩存cvm有多大價值,那麼能夠設置一個計數,來統記cvm被調用的次數算法
而後將CashierContext放入ThreadLocal中,而後再寫一個過濾器,在過濾器裏面能夠獲得獲取這個服務從緩存中取的次數,這個就能夠很容易看出來緩存價值。mongodb
那麼爲何不使用記數器自加呢,例如count++這樣的,由於這種計數是線程不安全的,高併發訪問時統計會有誤,而AtomicInteger爲何可以達到多而不亂,處理高併發應付自如呢,咱們纔看看AtomicInteger的源代碼:編程
你們能夠看到有這個變量,value就是你設置的自加起始值。注意看它的訪問控制符,是volatile,這個就是保證AtomicInteger線程安全的根源,熟悉併發的同窗必定知道在java中處理併發主要有兩種方式:swift
1,synchronized關鍵字,這個你們應當都各類面試和筆試中常常遇到。緩存
2,volatile修飾符的使用,相信這個修飾符你們平時在項目中使用的也不是不少。安全
這裏重點說一下volatile:cookie
Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存從新讀取該成員的值,並且,當成員變量值發生變化時,強迫將變化的值從新寫入共享內存,這樣兩個不一樣的線程在訪問同一個共享變量的值時,始終看到的是同一個值。session
java語言規範指出:爲了獲取最佳的運行速度,容許線程保留共享變量的副本,當這個線程進入或者離開同步代碼塊時,才與共享成員變量進行比對,若是有變化再更新共享成員變量。這樣當多個線程同時訪問一個共享變量時,可能會存在值不一樣步的現象。
而volatile這個值的做用就是告訴VM:對於這個成員變量不能保存它的副本,要直接與共享成員變量交互。
建議:當多個線程同時訪問一個共享變量時,能夠使用volatile,而當訪問的變量已在synchronized代碼塊中時,沒必要使用。
缺點:使用volatile將使得VM優化失去做用,致使效率較低,因此要在必要的時候使用。
參考知識庫