多线程

内存模型:

        计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。

  也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如下面的这段代码:i=i+1

   当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。

        这就产生了内存不一致的问题,为了解决这个问题,计算机提供了:

        1.总线lock(这种方式通过信号量实现,但是会导致cpu使用效率低下);

        2.缓存一致性协议(Intel的MESI协议)

        两种方式,这另种方式都是在硬件上提供的

多线程概念:

      1.原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行;

      2.可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值;

      3.有序性:即程序执行的顺序按照代码的先后顺序执行(由于cpu执行指令时存在重排序的情况,所以多线程下需要保证有序性);

针对计算机内存模型处理多线程时的特性,java在其内存模型(JMM)中,对于原子性的操作(既变量的直接性读写)可以使用synchronized和lock来实现;对于可见性和有序性可以使用volatile关键字修饰来实现;

       对于可见性和有序性,可以通过volatile(保证一个变量的写操作先行发生于后面对这个变量的读操作)修饰变量,如果被修改了值,会立即更新到主存中。synchronized和lock也可以保证可见性和有序性,只是跟volatile的机制不一样,synchronized和lock是通过线程锁保证线程的单一性,从而实现可见性和有序性的;

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值