文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

竟然将线程安全讲的如此清新脱俗,谈谈你对线程安全性的理解!

2024-12-01 19:12

关注

1.官方定义

线程安全通常是相对于多线程或者并发的情况下而言的。如果是单线程操作的话,就无所谓线程安全了。

简单来说,就是在多个线程环境下,访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,在不做任何干预的强可选,调用这个对象的行为都可以获得预期的结果,那么这个对象就是线程安全的。

看完这段,是不是还是很难理解?下面,我来分享一下看我是如何理解的。

2.Tom的理解

我认为,在多线程环境下保证线程安全,无非就是保证对对象访问的原子性、有序性和多个线程之间的可见性。

原子性呢,说的是当一个线程执行一系列程序指令操作的时候,它应该是不可中断的,因为一旦出现中断,站在多线程的视角来看,这一系列的程序指令会出现前后执行结果不一致的问题。

这个和数据库里面的原子性是一样的,简单来说就是一段程序只能由一个线程完整的执行完成,而不能存在多个线程干扰。CPU的上下文切换 , 是导致出现多线程原子性问题的核心原因 , 而JDK面也提供了synchronized 关键字来解决原子性问题。

然后,就是可见性,相当于在多线程环境下,可能会存在读和写是发生在不同的线程里面,有可能出现某个线程对共享变量的修改,对其他线程不是实时可见的。导致可见性问题的原因有很多,比如 CPU的高速缓存、CPU的指令重排、编译器的指令重排等因素。

最后,就是有序性,指的是程序编写的指令顺序和最终 CPU 运行的指令顺序可能出现不一致的现象,这种现象也可以称为指令重排序,所以有序性也会导致可见性问题。可见性和有序性可以通过JDK提供的volatile 关键字来解决。

我认为,导致有序性、原子性、可见性问题的本质,是计算机设计的时候,为了最大化提升 CPU 利用率导致的。比如CPU设计了三级缓存、设计了 StoreBuffer、设计了缓存行这种预读机制、在操作系统里面,设计了线程模型、在编译器里面,设计了编译器的深度优化机制等等。

我们都在说,面试造火箭,工作拧螺丝。对于企业来说,如果选择一个对计算机底层原理了解更透彻的程序员,不用担心他滥用线程导致一些不可预测的安全问题。其实也是在降低用人成本。

最后,我把之前分享的视频全部整理成了文字,想获取的小伙伴可以从我的个人煮叶简介中找到,希望能够以此来提高各位粉丝的通过率。

我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指一键三连分享给更多的人。关注我,面试不再难!

来源:Tom弹架构内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯