0

0

多线程并发的一些问题分享

零下一度

零下一度

发布时间:2017-06-28 09:13:08

|

1699人浏览过

|

来源于php中文网

原创

 一 概述

1.volatile

保证共享数据一旦被修改就会立即同步到共享内存(堆或者方法区)中。

2.线程访问堆中数据的过程

线程在栈中建立一个变量的副本,修改完毕后将数据同步到堆中。

3.指令重排

为了提高执行效率,CPU会将没有依赖关系的指令重新排序。如果希望控制重新排序,可以使用volatile修饰一个变量,包含该变量的指令前后的指令各自独立排序,前后指令不能交叉排序。

常见问题及应对

1.原子性问题

所谓原子性,指的是一个操作不可中断,即在多线程并发的环境下,一个操作一旦开始,就会在同一个CPU时间片内执行完毕。如果同一个线程的多个操作在不同的CPU时间片上执行,由于中间出现停滞,后面的操作在执行时可能某个共享数据被其他线程修改,而该修改并未同步到当前线程中,导致当前线程操作的数据与实际不符,这种由于执行不连贯导致的数据不一致问题被称作原子性问题。

2.可见性问题

可见性问题的出现与线程访问共享数据的方式有关。线程访问堆(方法区)中的变量时,先在栈中建立一个变量的副本,修改后再同步到堆中。如果一个线程刚建立副本,这时另一线程修改了变量,尚未同步到堆中,这时就会出现两个线程操作同一变量的同一种状态的现象,比如i=9,变量i的初始值为9,每一个线程的操作都是减1。两个线程A与B同时访问变量,B先执行i-1,在将结果i=8同步到堆中前,A线程也执行i-1,这时i=9的状态就被执行两次,出现线程安全问题。
    线程安全问题产生的原因:一个线程对共享数据的修改不能立即为其他线程所见。

volatile提供了一种解决方案:
    一旦一个线程修改了被volatile修饰的共享数据,这种修改就会立即同步到堆中,这样其他数据从堆中访问共享数据时始终获得的是在多个线程中的最新值。
    volatile的缺陷:

volatile只能保证一个线程从堆中获取数据时获取的是当前所有线程中的最新值,假如一个线程已经从堆中复制了数据,在操作完成前,其他线程修改了数据,修改后的数据并不会同步到当前线程中。

  3.有序性问题

为了提高执行效率,CPU会对那些没有依赖关系的指令重新排序,重新排序后的执行结果与顺序执行结果相同。
    例如,在源代码中:
    int i=0;
    int y=1;
    CPU在执行时可能先执行“int y=1;”,接着执行“int i=0;”,执行结果与顺序执行结果相同。
    指令重排在单线程环境下是安全的,在多线程环境下就可能出现问题。比如:
    线程A:

s=new String("sssss");//指令1flag=false;//指令2

线程B:

MVM mall 网上购物系统
MVM mall 网上购物系统

采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压

下载
while(flag){
doSome();
}
s.toUpperCase();//指令3

如果线程A顺序执行,即执行指令1,再执行指令2,线程B的执行不会出现问题。指令重排后,假如线程A先执行指令2,
    这是flag=true,切换到线程2,终止循环,执行指令3,由于s对象尚未创建就会出现空指针异常。
    有序性问题产生的原因:

一个线程对其他线程对共享数据的修改操作有顺序要求,比如线程B要求线程A先执行指令1,再执行指令2,由于指令重排,实际并未按照要求的顺序执行,这时就出现了线程安全问题。

    解决思路:

  1. 利用同步机制,使得同一时间只有一个线程可以访问共享数据,效率低。

  2. 使用volatile,一个指令包含volatile修饰的变量,那么这条指令的执行顺序不变,该指令前后的指令可以各自独立重排,无法交叉重排。

参考:

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
R 教程
R 教程

共45课时 | 5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号