什么是线程安全

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

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

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

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

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

 

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

例如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

你可能感兴趣的:(什么是线程安全)