#30天专注成长计划#java 线程安全与非线程安全

1.java 中常见的非线程安全类与线程安全的类

#30天专注成长计划#java 线程安全与非线程安全_第1张图片

2.什么是线程安全?什么是非线程安全的?他们有什么区别?

所谓的线程安全就是指多个线程操作同一个对象,可能会出现问题(下面会介绍一个ArrayList 的例子),而线程安全的是多个线程操作同一个对象不会出现问题(Vector),线程安全会

用到synchronized ,这个也导致了性能的下降

非线程安全≠不安全:非线程安全指的的多个线程操作同一个对象可能会出现问题,并不是在多线程中不能使用ArrayList或者其他的非线程安全的类。只要保证在多线程中操作的不是

同一个对象,就可以大胆的使用非线程的类。

3.示例:创建10 个线程,每个线程往ArrayList里面放100个元素,那么ArrayList 是不是就是10000呢?

#30天专注成长计划#java 线程安全与非线程安全_第2张图片

测试结果如下,甚至有时候会报数组越界异常(线程数加大,就会出现此异常):


#30天专注成长计划#java 线程安全与非线程安全_第3张图片
ArrayList

如果换成Vector呢?因为vector 是线程安全的的,结果就会是正确的。测试结果如下:


#30天专注成长计划#java 线程安全与非线程安全_第4张图片
Vector

如果换成LinkedList 呢? 此类也不是线程安全的。


#30天专注成长计划#java 线程安全与非线程安全_第5张图片
LinkedList

4.模拟线程安全实际是使用synchronized 实现,使用计数器实现。

代码如下:


#30天专注成长计划#java 线程安全与非线程安全_第6张图片
接着下图


#30天专注成长计划#java 线程安全与非线程安全_第7张图片

测试结果如下:


#30天专注成长计划#java 线程安全与非线程安全_第8张图片


当线程达到一定数量后,多个线程操作addcount() 就会出现问题,并不是我们想要的结果10001。此时如果在方法加上synchronized 或者锁住一个对象都可以保障线程安全?测试结果如下:

#30天专注成长计划#java 线程安全与非线程安全_第9张图片
代码



#30天专注成长计划#java 线程安全与非线程安全_第10张图片
测试结果


总结:线程安全实际上是为对象加了锁,这种虽然保证了安全,但是却降低了性能。那么有没有一种方法,既保障了安全,性能还能很好的保证呢?听说ConcurrentHashMap 可以。

和hashtable 一样是线程安全的,但是比他的效率高多了。

你可能感兴趣的:(#30天专注成长计划#java 线程安全与非线程安全)