多線程并發之原子性(六)

最近在網上找到好多的多線程關于原子性的例子,說的都不是非常的明確,對于剛學習多線程的新手而言很容誤導學員,在這里,我通過多個例子對多線程的原子性加以說明。

?

例子一:傳統技術自增

package face.thread.volatilep;public class Counter2 {private  int count = 0; public synchronized void inc() {count = count + 1;}public static void main(String[] args) {//同時啟動1000個線程,去進行i++計算,看看實際結果final Counter2 c = new Counter2();for (int i = 0; i < 1000; i++) {new Thread(new Runnable() {@Overridepublic void run() {c.inc();}}).start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//這里每次運行的值都有可能不同,可能為1000System.out.println("運行結果:Counter.count=" + c.count);}
}


以上代碼打印的結果偶爾會等于1000,基本上都會有一些誤差,原因是線程執行的順序無法保證的,很可能在新建的1000個線程還沒有執行完,我們的代碼

  System.out.println("運行結果:Counter.count=" + Counter.count);

就已經執行完了,要想解決這個問題很簡單,那就是在最后一句println之前在線程睡眠一段時間,比如睡眠2秒鐘。等1000個線程執行完了,在打印"

"運行結果:Counter.count=" + Counter.count";

?

還可以借助于線程輔助類解決,在這里就舉例一個最簡單的例子展示:

?

package face.thread.volatilep;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class Counter3 {int count =0;  public synchronized  void inc() {count++;}public static void main(String[] args) {//同時啟動1000個線程,去進行i++計算,看看實際結果final Counter3 c = new Counter3();final CyclicBarrier cy = new CyclicBarrier(10000, new Runnable() {public void run() {//這里每次運行的值都有可能不同,可能為1000System.out.println("運行結果:Counter.count=" + c.count);}});for (int i = 0; i < 10000; i++) {new Thread(new Runnable() {@Overridepublic void run() {c.inc();try {cy.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}).start();}}
}

?


例子二:原子性自增

原子是世界上的最小單位,具有不可分割性。比如 a=0;(a非long和double類型) 這個操作是不可分割的,那么我們說這個操作時原子操作。再比如:a++; 這個操作實際是a = a + 1;是可分割的,所以他不是一個原子操作。非原子操作都會存在線程安全問題,需要我們使用同步技術(sychronized)來讓它變成一個原子操作。一個操作是原子操作,那么我們稱它具有原子性。Java的concurrent包下提供了一些原子類,我們可以通過閱讀API來了解這些原子類的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。
因為原子性是線程安全的,所以關于原子性自增是不需要傳統的加鎖技術的,具體看代碼:
package face.thread.volatilep;import java.util.concurrent.atomic.AtomicInteger;public class CounterNew2{AtomicInteger count = new AtomicInteger(0);public void increment() {count.getAndIncrement();}public int getCount() {return count.get();}public static void main(String[] args) {final CounterNew2 cn = new CounterNew2();for(int i = 0 ; i < 10000;i++){new Thread(new Runnable() {public void run() {cn.increment();}}).start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("count最終返回值:" + cn.getCount());}
}
運行結果也是:10000

轉載于:https://www.cnblogs.com/chen1-kerr/p/6900051.html

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

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

相關文章

Points角點halcon算子,持續更新

目錄corner_responsedots_imagepoints_foerstnerpoints_harrispoints_harris_binomialpoints_lepetitpoints_sojkacorner_response 功能&#xff1a;在圖像中尋找角點。 dots_image 功能&#xff1a;在一個圖像中增強圓形點。 points_foerstner 功能&#xff1a;使用Frstn…

預編譯頭文件來自編譯器的早期版本,或者預編譯頭為 C++ 而在 C 中使用它(或相反)

當 Visual C 項目啟用了預編譯頭 (Precompiled header) 功能時&#xff0c;如果項目中同時混合有 .c 和 .cpp 源文件&#xff0c;則可能收到 C1853 編譯器錯誤&#xff1a;fatal error C1853: pjtname.pch precompiled header file is from a previous version of the compiler…

甲骨文稱 Java 序列化的存在是個錯誤,計劃刪除

甲骨文計劃從 Java 中去除序列化功能&#xff0c;因其在安全方面一直是一個棘手的問題。 Java 序列化也稱為 Java 對象序列化&#xff0c;該功能用于將對象編碼為字節流...Oracle 的 Java 平臺小組的首席架構師 Mark Reinhold 說&#xff1a;“刪除序列化是一個長期目標&#x…

CreateProcess

Windows 進程創建完整過程&#xff08;除去細節&#xff09; 當前流程是分析WinXP x86得到的&#xff0c;在最新版本Windows上不一定正確&#xff0c;但是可以做一個參考&#xff0c; 由于我這里符號并不全&#xff0c;所以導致我這里有些東西看到的可能是錯誤的&#xff0c;誤…

系統:Centos 7.2 內核3.10.0-327.el7.x86_64 # 內核需要高于2.6.32

系統&#xff1a;Centos 7.2 內核3.10.0-327.el7.x86_64 # 內核需要高于2.6.32 Drbd : 192.168.8.111&#xff1a;node1/dev/drdb0 /mydeta 192.168.8.112 : node2Mysql_vip: 192.168.8.200 #下章實現 # 需要的軟件包&#xff1a;mariadb-5.5.53-linux-i686.tar.gzdrbd84-utils…

Smoothing濾波處理halcon算子,持續更新

目錄anisotropic_diffusionbilateral_filterbinomial_filtereliminate_min_maxeliminate_spfill_interlacegauss_filterguided_filterinfo_smoothisotropic_diffusionmean_imagemean_nmean_spmedian_imagemedian_rectmedian_separate_median_weightedmidrange_imagerank_imager…

日志文件在VS中輸出為亂碼問題

原因&#xff1a;主要是文件文字格式問題&#xff08;使用使用 Unicode 字符集&#xff09;&#xff1a;修改項目/屬性/常規/字符集/ 未設置

初學者電腦編程入門

1、首先要對編程有個比較大概的了解&#xff0c;編程的對象&#xff0c;編程的原理&#xff0c;編程的目的等等。2、在了解編程基本知識后&#xff0c;要想想自己學習編程后到底要干什么以確定學習的方向。比如說是想要開發手機app&#xff0c;網站開發&#xff0c;企業系統等。…

MVC架構模式(2)

簡介&#xff1a; MVC最初是在Smaltalk_80中被用來構建用戶界面的。M代表模型Model&#xff0c;V代表視圖View&#xff0c;C代表控制器Controller。 Model模型層&#xff0c;可以簡單理解就是數據層&#xff0c;用于提供數據。在項目中&#xff0c;&#xff08;簡單理解&#x…

Scene Flow場景流halcon算子,持續更新

目錄scene_flow_calibscene_flow_uncalibscene_flow_calib 功能&#xff1a;計算兩個立體圖像對之間校準的場景流。 scene_flow_uncalib 功能&#xff1a;計算兩個立體圖像對之間未校準的場景流。

ios學習之旅---指針也不難

1、認識指針#include <stdio.h> //基本數據類型作為函數參數傳遞是值傳遞 //void moveFront(int x ,int y) //{ // x x 2; //} void test() {// 確定當前坐標int x 20;int y 150;printf("%p\n",&x);printf("%lu\n",&x);*((int *)(0…

FFmpeg中MPEG-4編碼程序追蹤,其他FFMPEG自帶編碼器同理

FFmpeg中與MPEG-4編碼相關的主要文件有mpegvideo.c&#xff0c;h263.c等。在mpegvideo.c中&#xff0c; AVCodec mpeg4_encoder { "mpeg4", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4, sizeof(MpegEncContext), MPV_encode_init, MPV_encode_picture, …

符合skyline的3dml網絡發布服務

技術交流群&#xff1a;665060698使用java web實現&#xff1b;接口符合skyline的3dml模型形式&#xff1b;通過簡單的發布界面&#xff0c;直接發布3dml模型&#xff1b;實現te pro在客戶端讀取數據&#xff1b;實現在te pro客戶端的對應查詢功能&#xff1b;負載可以達到skyl…

Texture Inspection 紋理檢驗halcon算子,持續更新

目錄deviation_imageentropy_imagetexture_lawsdeviation_image 功能&#xff1a;計算矩形窗口內的灰度值的標準偏差。 entropy_image 功能&#xff1a;計算矩形窗口內的灰度值的平均信息量。 texture_laws 功能&#xff1a;使用一個Laws文本濾波器&#xff08;地質變形&a…

51NOD 1125(交換機器最小代價) (貪心) 思想 !思想!

題目鏈接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId1125 1125 交換機器的最小代價基準時間限制&#xff1a;1 秒 空間限制&#xff1a;131072 KB 分值: 80 難度&#xff1a;5級算法題收藏關注有N臺機器重量各不相等&#xff0c;現在要求把這些機器按照…

《Python從小白到大牛》簡介

《Python從小白到大牛》已經上市&#xff01; 本書是一部系統論述Python編程語言、OOP編程思想以及函數式編程思想的立體化教程&#xff08;含紙質圖書、電子書、教學課件、源代碼與視頻教程&#xff09;。為便于讀者高效學習&#xff0c;快速掌握Python編程方法。本書作者精心…

c語言基礎知識_結構體訪問,共同體,枚舉類型

C語言結構體變量的引用&#xff1a;對于定義的結構體類型的普通變量&#xff0c;訪問其成員用圓點運算符&#xff08;“.”&#xff09;&#xff0c;標準訪問方式如下&#xff1a;   結構體變量名.成員名   對于定義為指向結構體的指針變量&#xff0c;用箭頭運算符&#x…

Wiener Filter維納濾波器halcon算子,持續更新

目錄gen_psf_defocusgen_psf_motionsimulate_defocussimulate_motionwiener_filterwiener_filter_nigen_psf_defocus 功能&#xff1a;產生一個均勻散焦模糊的脈沖相應。 gen_psf_motion 功能&#xff1a;產生一個&#xff08;線性&#xff09;運動模糊的脈沖相應。 simula…

【轉載】數據庫操作:添加、插入、更新語句

原始日期&#xff1a; 2016-07-22 12:03 SQL常用命令使用方法&#xff1a;(1) 數據記錄篩選&#xff1a;sql"select * from 數據表 where 字段名字段值 order by 字段名 [desc]"sql"select * from 數據表 where 字段名 like %字段值% order by 字段名 [desc]&qu…

webpack學習

全局安裝安裝webapck npm i webpack -g 現在我們就可以全局的使用webpack命令了 webpack中基礎的命令&#xff1a; webpack enter.js output.js --watch 這個命令是將enter.js打包成output.js&#xff0c;然后html只需要引用該文件就可以了看如下entry.js,這是簡單的js代碼。 /…