当前位置: 首页 > 科技观察

聊聊线程安全如此清新脱俗,聊聊你对线程安全的理解!

时间:2023-03-19 19:05:35 科技观察

1。线程安全的官方定义通常是相对于多线程或者并发的情况。如果是单线程操作,线程安全无所谓。简单的说,在多线程环境下访问同一个对象时,如果不需要考虑运行时环境中这些线程的调度和交替执行,没有任何干预,调用这个对象的行为就是如果可以得到预期的结果,则该对象是线程安全的。看完这一段,是不是还很难理解?接下来分享一下,看看我是怎么理解的。2、Tom的理解我认为在多线程环境下保证线程安全无非就是保证多线程间对象访问的原子性、顺序和可见性。原子性是指一个线程在执行一系列程序指令时,应该是不可中断的,因为一旦发生中断,从多线程的角度来看,这一系列程序指令执行前后就会出现结果不一致的问题。这和数据库中的原子性是一样的。简单的说,一个程序只能由一个线程完整执行,不受多个线程的干扰。CPU上下文切换是多线程原子性问题的核心原因,JDK端也提供了synchronized关键字来解决原子性问题。然后,就是可见性,也就是说在多线程环境下,读写可能发生在不同的线程中,有可能一个线程对共享变量的修改对其他线程实时不可见。造成可见性问题的原因有很多,比如CPU缓存、CPU指令重排、编译器指令重排等因素。最后是顺序,指的是程序编写的指令顺序可能与最终CPU执行的指令顺序不一致。这种现象也可以称为指令重排序,因此排序也会导致可见性问题。可见性和顺序可以通过JDK提供的volatile关键字来解决。在我看来,排序、原子性和可见性问题的本质是计算机为了最大化CPU利用率而设计造成的。比如CPU设计了三级缓存、StoreBuffer、缓存行的预读机制、操作系统中的线程模型、编译器中的编译器深度优化机制等等。我们都在谈论为采访建造火箭和为工作拧螺丝。对于企业来说,如果选择了对计算机底层原理比较了解的程序员,就不用担心他滥用线程导致一些不可预知的安全问题。事实上,这也是在降低就业成本。最后我把之前分享的视频都整理成文字了,想要领取的朋友可以到我的个人竹叶简介里找。希望这样可以提高粉丝的通过率。我是被编程耽误的文学汤姆。如果我的分享对你有帮助,请动动手指,分享给更多的人。跟我来,面试不再难!