java:多线程(上)

线程指的是进程中一个单一顺序的控制流一、什么是多线程(对多线程的理解)在现实生活当中我们可以看到计算机的发展其实一直是朝着拟人化的方向去发展的,随着现实当中工业的发展我们越来越希望计算机能够像人一样处理事情。那人是怎么处理事情的呢?举个简单的例子:人可以一边玩手机一边吃饭,两不耽误。或者有些人一边踱步,一边思考。那么计算机能不能同时做多件事,且互不影响呢?那首先我们需要知道计算机是如何工作的?二、早期CPU的工作原理早期的cpu只有一个逻辑运算单元(内核),我们知道计算机核心其实就是对数据
摘要由CSDN通过智能技术生成

线程指的是进程中一个单一顺序的控制流

一、什么是多线程(对多线程的理解)

  • 在现实生活当中我们可以看到计算机的发展其实一直是朝着拟人化的方向去发展的,随着现实当中工业的发展我们越来越希望计算机能够像人一样处理事情。那人是怎么处理事情的呢?举个简单的例子:人可以一边玩手机一边吃饭,两不耽误。或者有些人一边踱步,一边思考。那么计算机能不能同时做多件事,且互不影响呢?

那首先我们需要知道计算机是如何工作的?

二、早期CPU的工作原理

早期的cpu只有一个逻辑运算单元(内核),我们知道计算机核心其实就是对数据进行运算,那么一个逻辑运算元也就是说在同一时刻,只能去运算同一指令。比如有一个for循环。运算 i++的同时不能和i

for(int i =0;i<100;i++){
    count ++;
}

进而我们可以推算出,有两个for循环,在单个逻辑运算单元的前提下,只能去运算一个,另一个只能等待。如下图所示

for(int i =0;i<100;i++){
    count ++;
}
for(int j =0;i<100;j++){
    temp ++; //这个地方不是count++是有用的,不是随便写的
}

在早期的cpu内部并没有存储设备,那么我们的数据来源都是内存。cpu和内存之间是通过总线进行交互的,总线上传输的是电压信号,电压传输不能产生信号的干扰。这样就每次执行一个任务。这样显然不是我们想要的,我们想要的是计算机能够同时运算两个任务,那该怎么办呢?

我们不防给每一个任务一定的时间,我们让任务1和任务2交替执行,一个任务执行一定的时间,当这段时间运行完了,就切换另一个任务,这样从结果来看,我们基本可以认定为同时执行。

对于单核cpu来说的话两个任务正在根据时钟周期在进行快速的切换。不管这两个线程的指令有少个,我们同一时间只能有一个线程通过任务来对内存进行操作。

假如现在这两个任务都对内存当中的数据进行+1操作。任务1先被执行那么计算后的结果为2。

可是就恰在此时任务任务2线程执行,那么此时任务1执行出来的值就没有了,这样很不安全。为此我们需要将数据写回到内存当中去。那么从这个角度看多线程是十分安全的。

但是前边的算法也会存在一个问题就是,内存和cpu之间的交互是20ns,非常慢。那我们能不不能增加cpu的核数呢?

三、多核CPU

当我们使用多核cpu进行运算的时候,每一个任务都会在一个cpu内核当中运行。一个内核将任务完成之后需要将数据返回到内存当中,但是这样做会长时间占用数据的总线,如果在这个过程当中另一个任务完成也需要写回,由于cpu内部没有东西进行数据存储,那么刚刚计算出来的数据也就不存在了。

为了不让刚刚运行出来的数据消失,就需要在我们的cpu内部加一个小的缓存。

当缓存和cpu进行交互的时候这也就意味着总线会被释放,其他内核就可以通过总线来传输数据,而不会造成冲突。

但是这样做也会存在一个问题,比如两个任务同时都对同一个内存值进行更改,如上图所示。

无论任务1和任务2谁先执行和执行的快慢,执行完的数据需要放回到缓存当中,然后刷新会内存,无论哪个任务先刷新会内存,那么都会存在一个内存覆盖的问题,就是说后一个刷新会来的数据会覆盖掉前一个数据。

那如何解决这个问题呢?--------》这个问题没有答案,因为计算机不是这么设置。可有让同学们思考,加深印象。

(还有另一种现象会发生)

当任务1将数据执行了99次,却遇到了时间片用完或者缓存已满的情况将数据写回到内存变为99,与此同时任务2将数据只加了1次变成了2,也将数据写了内存,那么内存被覆盖为了2,当任务1结束阻塞状态将内存中的值读取入缓存的时候,在进行一个+1操作变为101写会内存,这样就会出现错误。

我们发现当两个任务去对同一个内存进行操作的时候会出现数据覆盖和计算错误等情况,那么我们如何解决呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值