1.java 中常见的非线程安全类与线程安全的类
2.什么是线程安全?什么是非线程安全的?他们有什么区别?
所谓的线程安全就是指多个线程操作同一个对象,可能会出现问题(下面会介绍一个ArrayList 的例子),而线程安全的是多个线程操作同一个对象不会出现问题(Vector),线程安全会
用到synchronized ,这个也导致了性能的下降。
非线程安全≠不安全:非线程安全指的的多个线程操作同一个对象可能会出现问题,并不是在多线程中不能使用ArrayList或者其他的非线程安全的类。只要保证在多线程中操作的不是
同一个对象,就可以大胆的使用非线程的类。
3.示例:创建10 个线程,每个线程往ArrayList里面放100个元素,那么ArrayList 是不是就是10000呢?
测试结果如下,甚至有时候会报数组越界异常(线程数加大,就会出现此异常):
如果换成Vector呢?因为vector 是线程安全的的,结果就会是正确的。测试结果如下:
如果换成LinkedList 呢? 此类也不是线程安全的。
4.模拟线程安全实际是使用synchronized 实现,使用计数器实现。
代码如下:
测试结果如下:
当线程达到一定数量后,多个线程操作addcount() 就会出现问题,并不是我们想要的结果10001。此时如果在方法加上synchronized 或者锁住一个对象都可以保障线程安全?测试结果如下:
总结:线程安全实际上是为对象加了锁,这种虽然保证了安全,但是却降低了性能。那么有没有一种方法,既保障了安全,性能还能很好的保证呢?听说ConcurrentHashMap 可以。
和hashtable 一样是线程安全的,但是比他的效率高多了。