今天面试被问到线程安全,咋一愣,有点懵,一时间竟不知道讲点啥,回来好好总结了一下;
首先,线程安全就是在多线程的情况下,如果对于一个共享变量的使用产生的结果是唯一确定的,那么便认为是线程安全!!!
那么在多线程的情况下,要想对一个共享的变量保证其为线程安全,则简单粗暴的方法就是对其操作的时候进行加锁,就是当一个线程占有此变量的时候不允许其他的线程对他进行操作,必须等到此线程对改变成的修改完成之后方能由其他变量对他进行操作。
还有一种就是cas,这家伙就是一个线程开始取了共享变量作为一个预期值,当要用的时候再看一下内存里的该变量是否与上次的预期值一样,当发现一样的时候,它就认为没有线程和我一起玩这个变量,我就可以对他进行操作,并且它此时对共享变量进行操作的时候利用的是lock总线锁,从最底层保证了原子性;而当他发现内存里面的值和原来取出来的预期值不一样时,就认为有线程对此变量进行操作了,则放弃此次操作,并且更新预期值,再重复以上操作直至完成。
至于volatile,这家伙就是保证了共享变量在各个线程之间的可见性,例如内存中的i = 1;其中两线程对 i 进行了读取操作,然后其中一个将 i 变为2;当 i 由volatile修饰的时候,内存和另一个线程中的 i 就会作废,并更新为新的 i ,和缓存的操作差不多,但是这个关键字只能保证可见性,而不能保证原子性,比如 i++ 这个语句其实是由三步组成的:将 i 取出,对它进行++操作,将操作后的 i 放回;而volitile是不能保证这三步一起完成,即当你取出来还没有进行++操作的时候可能别的线程又拿到了 i 并对他进行了操作,这样 i 的结果就不确定了,即保证不了安全性