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

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

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

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

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

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

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

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

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


ArrayList

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


Vector

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


LinkedList

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

代码如下:


接着下图


测试结果如下:



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

代码



测试结果


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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,981评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,942评论 0 62
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 5,594评论 2 17
  • 呵呵,今天收到了启蒙听听寄的证书和绘本,大米刚一放学就要看,于是我们娘三一起读了一本《我是怎么来的》。 新学校的数...
    悦米时光阅读 962评论 0 0
  • 小学时代对抽烟的好奇,是从尝试用干枯的丝瓜叶代替烟叶,用练习本代替烟纸,手工卷成的小喇叭烟开始的,人生的第一口烟...
    上孟默蒹阅读 3,188评论 4 1