谈谈线程安全

眉间皱痕 提交于 2019-11-30 10:26:53

进程之间有独立的内存空间,相互之间访问不到。

但是进程中有多个线程。每个线程都有各自的栈内存,这个栈内存也是各个线程自己私有的,别人访问不到;

但是进程中有公共的堆空间,是多个线程都可以访问得到的空间。如果大家都能访问到这个空间中的某个对象或方法。

那就存在数据被意外修改的风险,使得某个线程的数据被污染。这就是线程安全问题。

非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。

 

为例保证线程安全,于是就有了一些机制:

例如CAS(compare and swap),保存数据的状态然后检查数据是否被修改了,被修改的话,就重头再来。->开销较大,适用于线程不多,数据被修改的概率不大,但是存在这种可能;

还有一种是加锁机制->也是有开销的,但是能保证数据不被修改,适用于线程较多,大概率数据会被修改的情况;

 

线程安全必须要使用很多synchronized关键字来同步控制,所以必然会导致性能的降低。

所以在使用的时候,如果是多个线程操作同一个对象,那么使用线程安全的Vector;否则,就使用效率更高的ArrayList。

非线程安全!=不安全

====================================================

相关链接:

线程安全这么回答才牛逼:https://www.cnblogs.com/qiu18359243869/p/11009883.html

Java中的线程安全和非安全:https://www.cnblogs.com/lijingran/p/8722301.html

什么是线程安全:https://www.jianshu.com/p/f99a04cff60a

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!