多线程并发之原子性(六)

最近在网上找到好多的多线程关于原子性的例子,说的都不是非常的明确,对于刚学习多线程的新手而言很容误导学员,在这里,我通过多个例子对多线程的原子性加以说明。

 

例子一:传统技术自增

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.mzph.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代码。 /…