java.util.Vector真的安全&&synchronized==thread-safe

最近在研究设计模式的时候顺便看了下java.util.Observable类的实现,阅读该类源代码的时候碰到了一个让我困惑的地方。Observable定义了一个Vector的实例来保存观察者,按照javadoc的说明,Vector类是thread-safe的,但是为什么下面的代码还要在前面加上synchronized呢?

 

 

在介绍答案之前,先来说下几个基本概念,众所周知,synchronized是用来处理并发的,我想大部分人对这个的了解也仅限于此。每个java对象都有一个锁,要对共享的资源做并发处理就必需用好这把锁。使用synchronized修饰的函数必需获得对象锁才能够执行,获得锁后就独占了这把锁,只有函数执行完毕才能释放。也就是说如果一个类中有2个函数都是synchronized,那么对于一个对象来说,这2个函数是不可能同时执行的。

 

来看看下面的代码:

 

 

假如该代码片段没有用synchronized控制,就有可能出现异常。在调用v.size()后,马上有一个线程获取对象v的锁,执行deleteAll()操作,这时v.get()就会出错了。所以说synchronized≠thread-safe

 

好了,现在我们来说说addObserver这个方法为什么要用synchronized:

 

obs.contains(o)这个方法不是synchronized,如果不在addObserver加synchronized的话就会使得obs中有相同的观察者

 

为什么deleteObservers需要用synchronized限制。假设没有synchronized,而这时有另一线程调用了addObserver但是还没到obs.addElement这里,这时我们调用deleteObservers是可以把obs清空的,但是这个时候执行addElement的obs已不再是当初的obs了。

好了,这个问题困扰了我2天,直到今天去java官方论坛请教了一位牛人才得以解决,希望以上所述可以给大家提供一点帮助。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值