Atomic系列類

Atomic系列類別

Atomic系列類封裝了一系列的基礎類型和對象操作,其主要目的就是為了實現原子性,主要核心類如下

  • AtomicInteger
  • AtomicLong
  • AtomicBoolean
  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReference 原子性的引用對象
  • 在對Atomic類操作的時候,如果是有多個操作執行,那么就是非原子性的,需要加synchronized進行修飾,保證Atomic類操作整體原子性
package com.example.core.cas;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;public class UseAtomic {private static /* int count = 0*/AtomicInteger count = new AtomicInteger(0);public synchronized int add(){//使用synchronized關鍵字使得多個操作合并在一起,形成一個整體//return count.addAndGet(10);將+1+2+3+4代替+10,模擬多個操作count.addAndGet(1);count.addAndGet(2);count.addAndGet(3);count.addAndGet(4);return count.get();}public static void main(String[] args) {UseAtomic ua = new UseAtomic();List<Thread> list = new ArrayList<>();//如果使用atomicInteger最終結果一定是1000for (int i=0;i<100;i++){list.add(new Thread(new Runnable() {@Overridepublic void run() {System.out.println("累計結果:"+ua.add());}}));}for(Thread t:list){t.start();}}
}

另一個例子?

  • Person.class
package com.example.core.cas;public class Person {private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return "[name: " + this.name + ", age: " + this.age + "]";}
}
  • 多個線程搶占同一份資源,會造成問題
package com.example.core.cas;public class UseAtomicReference1 {private static Person person;public static void main(String[] args) throws InterruptedException {person = new Person("Tom", 18);System.out.println("Person is " + person.toString());Thread t1 = new Thread(new Task1());Thread t2 = new Thread(new Task2());t1.start();t2.start();t1.join();t2.join();Thread.sleep(100);System.out.println("Now Person is " + person.toString());}static class Task1 implements Runnable {public void run() {person.setAge(19);person.setName("Tom1");System.out.println("Thread1 Values "+ person.toString());}}static class Task2 implements Runnable {public void run() {person.setAge(20);person.setName("Tom2");System.out.println("Thread2 Values "+ person.toString());}}}
  • 使用Atomic,如果兩個線程逐次訪問并修改資源,可以保證數據一致性;如果同時訪問,其中一個就會返回false,不修改數據
  • 避免產生并發行
package com.example.core.cas;import java.util.concurrent.atomic.AtomicReference;public class UseAtomicReference2 {// 普通引用private static Person person;// 原子性引用private static AtomicReference<Person> aRperson;public static void main(String[] args) throws InterruptedException {person = new Person("Tom", 18);aRperson = new AtomicReference<Person>(person);System.out.println("Atomic Person is " + aRperson.get().toString());Thread t1 = new Thread(new Task1());Thread t2 = new Thread(new Task2());t1.start();t2.start();t1.join();t2.join();Thread.sleep(500);System.out.println("Now Atomic Person is " + aRperson.get().toString());}static class Task1 implements Runnable {  public void run() {System.err.println("ret = " + // C A S 原子操作aRperson.compareAndSet(  //10ms aRperson.get(), //如果滿足我的預期,就進行修改;不滿足就不修改new Person("Tom", aRperson.get().getAge() + 1)));System.out.println("Thread1 Atomic References "+ aRperson.get().toString());}}static class Task2 implements Runnable {public void run() {System.err.println("ret = " + aRperson.compareAndSet(		//8msaRperson.get(), //如果滿足我的預期,就進行修改;不滿足就不修改new Person("Tom", aRperson.get().getAge() + 2)));System.out.println("Thread2 Atomic References "+ aRperson.get().toString());}}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 系統學習筆記(十二)---os os.path os.walk

得到當前工作目錄&#xff0c;即當前 Python腳本工作的目錄路徑: os.getcwd() 返回指定目錄下的所有文件和目錄名:os.listdir()函數用來刪除一個文件:os.remove()刪除多個目錄&#xff1a;os.removedirs&#xff08;r“c&#xff1a;\python”&#xff09;檢驗給出的路徑是否是…

Java JUC工具類--CountDownLatch

CountDownLatch&#xff1a;用于監聽某些初始化操作&#xff0c;并且線程進行阻塞&#xff0c;等初始化執行完畢后&#xff0c;通知主線程繼續工作執行 package com.example.core.juc;import java.util.concurrent.CountDownLatch;public class UseCountDownLatch {public stat…

Java JUC工具類--CyclicBarrier

CyclicBarrier&#xff1a;柵欄的概念&#xff0c;多線程的進行阻塞&#xff0c;等待某一個臨界值條件滿足后&#xff0c;同時執行 類比&#xff1a;每個線程代表一個跑步運動員&#xff0c;當運動員都準備好后&#xff0c;才一起出發&#xff0c;只要有一個人沒有準備好&#…

人生感悟:人生像吃自助餐

問我怎樣管理欲望&#xff0c;過簡單生活?我的答案是&#xff1a;你要先學會品味人生&#xff0c;品味的同義詞&#xff0c;就叫做體悟內涵。 人為什么有這么多欲望?其實&#xff0c;我們每個人在一個社會&#xff0c;就像進入一個自助餐(buffet)店&#xff0c;食物非常的多…

Java JUC工具類--Future

Future模式&#xff0c;也是非常經典的設計模式&#xff0c;這種模式主要就利用空間換時間的概念&#xff0c;也就是說異步執行&#xff08;需要開啟一個新的線程&#xff09;在互聯網高并發的應用服務中&#xff0c;我們隨處可見這種理念和代碼&#xff0c;主要就是使用了這種…

職場與生活 八條原則 讓你不再浪費時間和提高效率

Heidi Roizen女士一度是硅谷人人爭相學習的典范。她曾創辦自己的公司并管理了14年之久。后來&#xff0c;她擔任蘋果公司主管開發者關系的高級副總裁。現在&#xff0c;她是DFJ Venture的一位風投家&#xff0c;她還在斯坦福主講一門名叫??“企業家精神??”的課程。她幾乎認…

Java JUC工具類--Exchanger

Exchanger Exchanger用于進行線程間的數據交換&#xff0c;它提供一個同步點&#xff0c;在這個同步點&#xff0c;兩個線程可以交換彼此的數據兩個線程通過exchange方法交換數據&#xff0c;如果一個線程先執行exchange方法&#xff0c;它會一直等待第二個線程也執行exchang…

爸爸的素質決定孩子飛多高,爸爸們請反復看!!!

好父親等于200個好老師&#xff0c;當爹的都好好看看&#xff0c;以后孩子不給力別怨別人! 孩子是父親的影子&#xff0c;希望每個閱讀完全文的父親&#xff0c;都能成為一個好父親。 NO.1爸爸是孩子最好的老師 爸爸的素質有多高&#xff0c;孩子就能飛多高 用理性的父愛幫…

Java JUC工具類--ForkJoin

ForkJoin Fork/Join框架是JAVA7提供的一個用于并行執行任務的框架&#xff0c;是一個把大任務分割成若干個小任務&#xff0c;最終匯總每個小任務結果后得到大任務結果的框架Fork/Join中兩個重要的類 ForkJoinTask&#xff1a;使用該框架&#xff0c;需要創建一個ForkJoin任務…

修復bug的12個關鍵步驟

要多少時間才能修復bug&#xff0c;事先是很難知道的&#xff0c;特別是如果你和這些代碼還素不相識的話&#xff0c;情況就更加撲朔迷離了。James Shore在《The Art of Agile 》一書中&#xff0c;明確指出要想修復問題得先知道問題的所在。而我們之所以無法準確估計時間是因為…

Java JUC工具類--Master-Worker

Master-Worker Master-Worker模式是常用的并行計算模式。它的核心思想是系統由兩類進程協作工作&#xff1a;Master進程和Worker進程Master負責接收和分配任務&#xff0c;Worker負責處理子任務當各個Worker子進程處理完成后&#xff0c;會將結果返回給Master&#xff0c;由Ma…

身體打來的電話,你一定要接!

心臟有問題時。左邊手臂會酸、麻、痛。肝臟有問題時。小腿晚上睡覺時容易抽筋。腎臟出現問題時。聲音就會出不來&#xff0c;就會沙啞。脾胃出現問題時。偏頭痛。附&#xff1a;五臟排毒最簡單有效的方法 一、心臟有問題時 1。呼吸會不順暢&#xff0c;胸口會悶也會刺痛&…

Java JUC工具類--Semaphore

Semaphore 在Semaphore信號量非常適合高并發訪問限制&#xff0c;新系統在上線之前&#xff0c;要對系統的訪問量進行評估&#xff0c;評估是經過以往的經驗、數據、歷年的訪問量&#xff0c;已經推廣力度進行一個合理的評估當然評估標準不能太大也不能太小&#xff0c;太大的…

python 基礎知識點整理 和具體應用

Python教程 Python是一種簡單易學&#xff0c;功能強大的編程語言。它包括了高效的高級數據結構和簡單而有效的方法&#xff0c;面向對象編程。Python優雅的語法&#xff0c;動態類型&#xff0c;以及它天然的解釋能力&#xff0c;使其成為理想的語言&#xff0c;腳本和應用程序…

Java 線程池相關問題

線程池的拒絕策略 AbortPolicy&#xff1a;直接拋出異常阻止系統正常工作。CallerRunsPolicy&#xff1a;只要線程池未關閉&#xff0c;該策略直接在調用者線程中&#xff0c;運行當前被丟棄的任務。DiscardOldestPolicy&#xff1a;丟棄最老的一個請求&#xff0c;嘗試再次提…

對編程人員我想說:多做 多實踐 多寫代碼

有很多人問我&#xff0c;怎樣提高自己的能力&#xff1f;有初學者&#xff0c;有水平達到一定程度的程序員。 我想說&#xff0c;不要過多的看代碼&#xff0c;看計算機理論&#xff0c;看別人寫的文章&#xff0c;代碼等&#xff0c;最重要的是自己理解了某個原理&#xff0c…

讀人是基礎,看人是關鍵,做人最重要

人生在世&#xff0c;讀人是基礎&#xff0c;看人是關鍵&#xff0c;做人最重要。 一、讀人——一個人就是一本書。讀人&#xff0c;比讀其他文字的書更難。在生活中&#xff0c;每個人都是書&#xff0c;每人又都是讀者。我們認認真真地讀&#xff0c;讀了大半輩子&#xff0c…

使用postman模擬百度通用文字識別

1&#xff0c;登錄百度AI開放平臺 百度AI網站新手指南鏈接在頂部導航欄中&#xff0c;找到控制臺選項&#xff0c;輸入賬號和密碼&#xff0c;進入管理中心頁面在管理中心頁面中&#xff0c;找到文字識別的選項找到創建應用的選項&#xff0c;進行ocr項目的創建需要輸入應用的…

3個觀念 不再瞎學習!

此刻&#xff0c;你應該要做什么準備&#xff1f;加碼股市還是追逐房市&#xff1f;都不是。在你分配時間、資源的投資組合里&#xff0c;有沒有這一項&#xff1a;“自己”&#xff1f; 沒有人會否認充實自我的重要&#xff0c;但是經歷一場金融風暴大震撼&#xff0c;當企業…