美国上市公司,专注Java培训22年

同步容器( 如 Vector )并不是所有操作都线程安全


对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全?

同步容器( 如 Vector )并不是所有操作都线程安全

这个问题的正解应该是什么的。

问:对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全?

答:同步容器中的所有自带方法都是线程安全的,因为方法都使用synchronized关键字标注。但是,对这些集合类的复合操作无法保证其线程安全性。需要客户端通过主动加锁来保证

如果你看过JDK的源码,那么你会发现,像Vector这样的同步容器的所有共有方法全都是synchronized的。也就是说,我们可以在多线程场景中放心的使用单独这些方法,因为这些方法本身的确是线程安全的。那么为什么又说复合操作无法保证线程安全呢?这里举个栗子,我们定义如下删除Vector中最后一个元素方法:

同步容器( 如 Vector )并不是所有操作都线程安全

上面这个方法是一个复合方法,包括size()和remove(),乍一看上去好像并没有什么问题,无论是size()方法还是remove()方法都是线程安全的,那么整个deleteLast方法应该也是线程安全的。但是时,如果多线程调用该方法的过程中有,remove方法有可能抛出ArrayIndexOutOfBoundsException。我们看一下remove方法具体实现,什么情况下会抛出这个异常呢。

同步容器( 如 Vector )并不是所有操作都线程安全

从上面代码中可以看出,当index >= elementCount时,会抛出ArrayIndexOutOfBoundsException,也就是说,当当前索引值不再有效的时候,将会抛出这个异常。因为removeLast方法,有可能被多个线程同时执行,当线程一通过index()获得索引值为10,在尝试通过remove()删除该索引位置的元素之前,线程2把该索引位置的值删除掉了,这时线程一在执行时便会抛出异常。

为了避免出现类似问题,可以尝试加锁:

同步容器( 如 Vector )并不是所有操作都线程安全

如上,我们在deleteLast中,对v进行加锁,即可保证同一时刻,不会有其他线程删除掉v中的元素。

至此,我们已经解释清楚了我们的问题。

问:对于线程安全的集合类(例如Vector)的任何操作是不是都能保证线程安全?

答:同步容器中的所有自带方法都是线程安全的,因为方法都使用synchronized关键字标注。但是,对这些集合类的复合操作无法保证其线程安全性。需要客户端通过主动加锁来保证。

由于我们自己已知Vector等同步容器是线程安全的,所以我们通常在多线程场景中会直接拿来使用,并不会考虑太多,从而可能导致问题。

所以,我们在使用同步容器的时候,如果只使用其中的自带方法,那么可以放心使用,因为他们是线程安全的,但是如果我们想做复合操作,尤其是涉及到删除容器中的元素时,一定要注意是否需要客户端主动加锁。

下面,我们考虑以下代码,如果在多线程场景中使用会不会出现线程安全问题:

同步容器( 如 Vector )并不是所有操作都线程安全

显然,以上代码在迭代的过程中,并不会出现线程安全问题。但是,如果在程序中还有以下代码有可能被同时调用呢?

同步容器( 如 Vector )并不是所有操作都线程安全

由于,不同线程在同一时间操作同一个Vector,其中包括删除操作,那么就同样有可能发生线程安全问题。所以,在使用同步容器的时候,如果涉及到多个线程同时执行删除操作,就要考虑下是否需要加锁。

感谢大家阅读由java培训机构分享的“同步容器( 如 Vector )并不是所有操作都线程安全”希望对各位学员有所帮助,更多精彩内容请关注Java培训官网

免责声明:本文由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • 一个故事讲完https
    一个故事讲完https
    感谢大家阅读由java培训机构分享的“一个故事讲完https”希望对大家有所帮助 详情>>

    2017-08-31

  • GitHub 上火的 Java 框架
    GitHub 上火的 Java 框架
    Java 是目前最需要的编程语言之一。在这里,我们已经挖掘了一些关于框架趋势的有用信息,也就是最受开发者青睐的 Java 框架,名单如下 详情>>

    2017-10-24

  • Java入门学习路径,没有之一
    Java入门学习路径,没有之一
    作为刚刚进入Java领域的新同学,无论是高校的毕业大学生,还是有志转行的在职人员,都面临着诸多的困惑。今天java培训班就来为大家讲解下Java入门学习路径 详情>>

    2017-11-23

  • java初学者学习心得
    java初学者学习心得
    学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java),兴趣最重要。下面请看java培训机构带来的分享 详情>>

    2017-12-12

  • Java开班时间

    收起