线程安全问题

  今天面试被问到线程安全,咋一愣,有点懵,一时间竟不知道讲点啥,回来好好总结了一下;面试

  首先,线程安全就是在多线程的状况下,若是对于一个共享变量的使用产生的结果是惟一肯定的,那么便认为是线程安全!!!缓存

  那么在多线程的状况下,要想对一个共享的变量保证其为线程安全,则简单粗暴的方法就是对其操做的时候进行加锁,就是当一个线程占有此变量的时候不容许其余的线程对他进行操做,必须等到此线程对改变成的修改完成以后方能由其余变量对他进行操做。安全

  还有一种就是cas,这家伙就是一个线程开始取了共享变量做为一个预期值,当要用的时候再看一下内存里的该变量是否与上次的预期值同样,当发现同样的时候,它就认为没有线程和我一块儿玩这个变量,我就能够对他进行操做,而且它此时对共享变量进行操做的时候利用的是lock总线锁,从最底层保证了原子性;而当他发现内存里面的值和原来取出来的预期值不同时,就认为有线程对此变量进行操做了,则放弃这次操做,而且更新预期值,再重复以上操做直至完成。多线程

  至于volatile,这家伙就是保证了共享变量在各个线程之间的可见性,例如内存中的i = 1;其中两线程对 i 进行了读取操做,而后其中一个将 i 变为2;当 i 由volatile修饰的时候,内存和另外一个线程中的 i 就会做废,并更新为新的 i ,和缓存的操做差很少,可是这个关键字只能保证可见性,而不能保证原子性,好比 i++ 这个语句实际上是由三步组成的:将 i 取出,对它进行++操做,将操做后的 i 放回;而volitile是不能保证这三步一块儿完成,即当你取出来尚未进行++操做的时候可能别的线程又拿到了 i 并对他进行了操做,这样 i 的结果就不肯定了,即保证不了安全性线程

相关文章
相关标签/搜索