CountDownLatch等待多线程并发的工具类

本文通过一个CountDownLatch的例子展示了在多线程环境下,不安全的自增运算可能导致结果错误。由于自增操作不是原子性的,当多个线程同时访问时,可能会丢失更新,造成最终结果与预期不符。分析了自增操作的非原子性,并讨论了线程安全问题的重要性。
/**
 * CountDownLatch(倒数闩)是一个非常实用的等待多线程并发的工具类。
 * 10个线程并行运行,对一个共享数据进行自增运算,每个线程自增运算1000次,具体
 * @author ADMIN
 *
 */
public class CountDownLatchTest {
   final static int  max_tread =10;//10个线程并行运行
   final static int max_run =1000;//每个线程自增运算1000次
   //测试不安全的累加器
   public static void main(String[] args) throws InterruptedException {
      //倒数闩 需要倒数10次
      CountDownLatch latch =new CountDownLatch(max_tread);
      NotSafePlus count=new NotSafePlus();
      Runnable runn=()->{
         System.out.println(Thread.currentThread().getName());
         for(int i=0;i<max_run;i++) {
            count.selfPlus();
         }
         latch.countDown();//倒数闩减少一次
      };
      for(int i=0;i<max_tread;i++) {
         new Thread(runn).start();
      }
      latch.await();//等待倒数闩的次数减少到0,所有线程执行完毕
      System.out.println("理论结果为:"+max_tread *max_run);
      System.out.println("实际结果为:"+count.getAmount());
      System.out.println("差距为:"+(max_tread *max_run -count.getAmount()));
      
      
   }
}
class NotSafePlus{
   private Integer amount=0;
   //自增
   public void selfPlus() {
      amount++;
   }
   public Integer getAmount() {
      return amount;
   }
   public void setAmount(Integer amount) {
      this.amount = amount;
   }
   
}

为什么自增运算符不是线程安全的呢?实际上,一个自增运算符是 一个复合操作,至少包括三个JVM指令:“内存取值”“寄存器增加 1”和“存值到内存”。这三个指令在JVM内部是独立进行的,中间完全可 能会出现多个线程并发进行。

比如在amount=100时,假设有三个线程同一时间读取amount值,读 到的都是100,增加1后结果为101,三个线程都将结果存入amount的内 存,amount的结果是101,而不是103。

“内存取值”“寄存器增加1”和“存值到内存”这三个JVM指令本身是不 可再分的,它们都具备原子性,是线程安全的,也叫原子操作。但是, 两个或者两个以上的原子操作合在一起进行操作就不再具备原子性了。 比如先读后写,就有可能在读之后,其实这个变量被修改了,出现读和 写数据不一致的情况

一、项目参加人员、负责内容以及技术特长: "主要人员 "负责内容 "技术特长 " " "自制稳压电源的设计,撰 "数字电路设计,应用软件 " " "写论文电路精度的调节, " " " "键盘、数控部分、数字显 "单片机编程以及电路设计 " " "示的设计,单片机编程 " " " "D/A转换以及精度,输出电"模拟电路设计 " " "路的设计 " " 二、项目背景 数控直流稳压电源是电子技术常用的设备之一,广泛的应用于教学、科研等领域。传 统的多功能直流稳压电源功能简单、难控制、可靠性低、干扰大、精度低且体积大、复 杂度高。普通直流稳压电源品种很多, 在家用电器和其他各类电子设备中,通常都需要电压稳定的直流电源供电。但在实际生 活中,都是由220V 的交流电网供电。这就需要通过变压、整流、滤波、稳压电路将交流电转换成稳定的直 流电。滤波器用于滤去整流输出电压中的纹波,一般传统电路由滤波扼流圈和电容器组 成,若由晶体管滤波器来替代,则可缩小直流电源的体积,减轻其重量,且晶体管滤波 直流电源不需直流稳压器就能用作家用电器的电源,这既降低了家用电器的成本,又缩 小了其体积,使家用电器小型化。 电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。电力 电子技术是电能的最佳应用技术之一。当今电源技术融合了电气、电子、系统集成、控 制理论、材料等诸多学科领域。随着计算机和通讯技术发展而来的现代信息技术革命, 给电力电子技术提供了广阔的发展前景,同时也给电源提出了更高的要求。随着数控电 源在电子装置中的普遍使用,普通电源在工作时产生的误差,会影响整个系统的精确度 。电源在使用时会造成很多不良后果,世界各国纷纷对电源产品提出了不同要求并制定 了一系列的产品精度标准。只有满足产品标准,才能够进入市场。 随着经济全球化的发展,满足国际标准的产品才能获得进出的通行证。数控电源是从 80年代才真正的发展起来的,期间系统的电力电子理论开始建立。这些理论为其后来的 发展提供了一个良好的基础。在以后的一段时间里,数控电源技术有了长足的发展。但 其产品存在数控程度达不到要求、分辨率不高、功率密度比较低、可靠性较差的缺点。 因此数控电源主要的发展方向,是针对上述缺点不断加以改善。单片机技术及电压转换 模块的出现为精确数控电源的发展提供了有利的条件。新的变换技术和控制理论的不断 发展,各种类型专用集成电路、数字信号处理器件的研制应用,到90年代,己出现了数 控精度达到0.05V的数控电源,功率密度达到每立方英寸50W的数控电源。目前在电力电 子器件方面,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦。 随着人们生活水平的不断提高,数字化控制无疑是人们追求的目标之一,它所给人带来的 方便也是不可否定的,其中数控制直流稳压电源就是一个很好的典型例子。但人们对它的 要求也越来越高,要为现代人工作、科研、生活提供更好的更方便的设施,就需要从数字 电子技术入手,一切向数字化和智能化方向发展。 数字化智能电源模块是针对传统智能电源模块的不足提出的,数字化能够减少生产过 程中的不确定因素和人为参与的环节数,有效地解决电源模块中诸如可靠性、智能化和 产品一致性等工程问题,极大地提高生产效率和产品的可维护性。 三、主要研究内容 一、设计任务 设计出有一定输出电压范围和功能的数控电源。 其原理示意图如下: +10V -10V +5V 220V 二、设计要求 1.基本要求 (1)输出电压:范围 0~+9.9V,步进 0.1V,纹波不大于 10mV; (2)输出电流:500mA; (3)输出电压值由数码管显示; (4)由"+"、"-"两键分别控制输出电压步进增减; (5)为实现上述几部件工作,自制一稳压直流电源,输出±10V,+5V。 2.发挥部分 (1)输出电压可预置在 0~9.9V 之间的任意一个值; (2)用自动扫描代替人工按键,实现输出电压变化(步进 0.1V 不变); (3)扩展输出电压种类(比如三角波等)。 四、总体思路与研究方案 1. 总体思路 随着时代的发展,数字电子技术已经普及到我们生活、工作、科研等各个领域,本文 将介绍一种数控直流电源,本电源由电源电路、显示电路、控制电路、数模转换电路四 部分组成。准确说就是电源电路提供各个芯片电源、数码管、放大器所需电压,显示电 路用于显示电源输出电压的大小,同时分析了数字技术和模拟技术相互转换的概念。与 传统的稳压电源相比具有操作方便,电源稳定性高以及其输出电压大小采用数码显示的 特点。 数控电压源是最常用的仪器设备,在科研及实验中都是必不可少的。目前所使用的直 流可调电源中,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦 。利用数控电压源,可以达到每步0.1V的精度,输出电压范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值