进程之间有独立的内存空间,相互之间访问不到。
但是进程中有多个线程。每个线程都有各自的栈内存,这个栈内存也是各个线程自己私有的,别人访问不到;
但是进程中有公共的堆空间,是多个线程都可以访问得到的空间。如果大家都能访问到这个空间中的某个对象或方法。
那就存在数据被意外修改的风险,使得某个线程的数据被污染。这就是线程安全问题。
非线程安全是指多线程操作同一个对象可能会出现问题。而线程安全则是多线程操作同一个对象不会有问题。
为例保证线程安全,于是就有了一些机制:
例如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
什么是线程安全:https://www.cnblogs.com/lixinjie/p/a-answer-about-thread-safety-in-a-interview.html#4249651#undefined