多线程并发原子性,可见性,有序性分析

本文介绍了多线程并发的三大特性:原子性、可见性和有序性。通过实例分析了非原子操作导致的问题,并探讨了解决并发问题的方法,如使用volatile、synchronized和Lock来确保原子性、可见性和有序性。此外,文章还提到了Semaphore在流量控制中的应用,以限制并发线程的数量。
摘要由CSDN通过智能技术生成

目录

1.什么是多线程并发?

2.机器内存分配及线程对内存操作(操作示例) 

2.1机器内存分配

2.2线程对内存操作

3.解决多线程并发问题


多线程的三个特性:

a.原子性

是指一个操作是不可中断,即使多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰;简单看几个例子:

1)int x=10;  2)int y=x; 3)x++; 4.x=x+1;

这上面四个语句,区分哪些是原子操作,哪些非原子操作?

1)第一句,直接把10赋值给x的工作内存,这个操作是不可再分的,并且很直接,这就是原子操作;

2)第二句,先读取x的值,然后将x的值写入到y的工作内存,这个可分割,并且不直接,这就不是原子操作 ;

3)第三句,其实和第四句一样都是执行x+1;先读取x的值,然后进行+1操作,才会将新值写入x的工作内存;

所以可以看出来,所谓的原子操作,原子性就是直接对一个变量进行操作,中间没有别的操作(实际指的是操作不可分割性);

b.可见性

是指当线程1修改某一个共享变量的值,线程1修改完成以后,线程2能够立即知道修改完成后共享变量的值,那么说明是可见的;可见性就是说线程之间操作共享变量时,彼此之间都知道;

c.有序性

有序性就是指执行代码是有序去执行,线程1先执行,完了之后线程2再去执行;

1.什么是多线程并发?

在Android或者Java开发中,遇到多线程并发问题的时候次数比较多,多线程并发是指多条线程共同访问同一个数据源时,往往不能得到预期结果;产生无法获取预期结果的原因是什么?其实就是该共同访问数据源对多线程没有可见性,这些线程不能有序性的去操作共同的数据源,还不是原子操作,所以导致预期结果不一样;

2.机器内存分配及线程对内存操作(操作示例) 

2.1机器内存分配

2.2线程对内存操作

在“机器内存分配”图可以看到JVM栈也就是Java虚拟机栈,每个线程启动都会有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值