首页 > 编程语言 >并发编程BUG源头

并发编程BUG源头

时间:2023-03-08 19:57:58浏览次数:40  
标签:缓存 Thread 编程 CPU 并发 test 线程 Test BUG

背景

核心矛盾

CPU/内存/IO设备的速度差异

解决思路

  1. 计算机体系结构——CPU 增加了缓存,以均衡与内存的速度差异
  2. 操作系统——操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异
  3. 编译程序——编译程序优化指令执行次序,使得缓存能够得到更加合理地利用

异常根源

天下没有免费的午餐,并发程序很多诡异问题的根源也对应着上述解决思路。

cpu缓存导致的可见性问题

可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到

硬件程序员给软件程序员挖的坑~ 不同线程可能会对应不同cpu以及其不同的缓存。

public class Test {

   private long count = 0;

   private void add10K() {
       int idx = 0;
       while(idx++ < 10000) {
           count += 1;
       }
   }

   public static long calc() throws InterruptedException {
       final Test test = new Test();
       // 创建两个线程,执行add()操作
       Thread th1 = new Thread(test::add10K);
       Thread th2 = new Thread(test::add10K);
       // 启动两个线程
       th1.start();
       th2.start();
       // 等待两个线程执行结束
       th1.join();
       th2.join();
       return test.count;
   }

   public static void main(String[] args) throws InterruptedException {
       System.out.println(Test.calc());
   }
}

值为10000-20000之间都随机数,因为

标签:缓存,Thread,编程,CPU,并发,test,线程,Test,BUG
From: https://www.cnblogs.com/kiper/p/17195884.html

相关文章

  • 如何轻松学习网页设计和网页编程?
    学习网页设计和网络编程可能是一种有趣而有意义的体验,但需要时间,精力和练习.这里有一些技巧可以帮助您更轻松地学习这些技能:从基础知识开始:在您深入研究高级主题之前,重......
  • 平衡车项目MPU6050编程感想
    0.发现延时函数没有用,延时1s,但是printf()的频率非常快,目前不知道原因,猜测与MPU6050的FIFO有关系。 1. 昨天读数据,同时读编码器和MPU6050的一个实验,如果编码器能读数,M......
  • C++自定义比较函数的bug
    autocmp=[](intx,inty){returntrue;};priority_queue<int,vector<int>,cmp>q;报错第三个参数失配,需要一个类型,而不是对象。平时用sort直接传cmp习惯了,才发......
  • 实验1 C语言开发环境使用和编程初体验
    实验任务1程序源码//打印一个字符小人#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");printf("O\n");printf("<H>\n");......
  • 数据库实现并发扣减
    读业务的特点是写少读多扣减类业务的定义,我把关于扣减的实现,需要关注的技术点总结如下:当前剩余的数量需要大于等于当次需要扣减的数量,即不允许超卖;对同一个数据的数......
  • 三大 Shader 编程语言(CG/HLSL/GLSL)
    什么是ShaderLanguageShaderLanguage的发展方向是设计出在便携性方面可以和C++、Java等相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染过程”......
  • (转)GO的网络编程分享
    原文:https://learnku.com/articles/57947开始socket编程先上一张图,我们一起瞅瞅Socket是应用层与TCP/IP协议族通信的中间软件抽象层在设计模式中,Socket其实就是一......
  • socket编程2
    客户端服务端编程模型:  服务器调用序列                                                       ......
  • 并发编程01-线程与进程
    进程进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(如记事本、浏览器等),也有的程序只能启动一个实例进程(如酷狗音乐,安全管家)线程一个进程之内可......
  • socket编程1
    socket是一种通讯机制,它给应用程序提供了使用如TCP/UDP的网络协议的方式;linux中的网络编程是通过socket接口实现的,socket是一种特殊的IO,提供对应的文件描述符。一个完整......