用ArrayList(假设list是一个ArrayList的实例)加上synchronized关键字,是不是也能达到Vector那样的线程安全的效果?
如果说Vector是线程安全的,那么我用ArrayList,假如list是一个ArrayList的实例,我加上了这synchronized(list);效果不就和Vector一样了吗?
请指点!
问题点数:10、回复次数:6Top
1 楼lizzz(不是程序员)回复于 2005-01-03 12:44:08 得分 7
表面上看好像功能是一样的,我觉得其实不然
首先list这样做属于对象锁,而Vector属于类锁。
对象所的执行先后顺序取决于CPU的轮转,比如所两个线程在同时(有时间先后)分别调用get和remove方法的时候,假设get线程先进入,remove线程才进入。这是两个线程指令的执行顺序取决于CPU下一条指令是执行get线程还是remove线程。但使用Vector就不可能会有这种问题。一旦一个线程在使用另外的线程就没有办法使用(不要说同时/无差别执行,CPU的运行总是一条一条的指令的执行的)
这是我的一些认识,不一定正确。Top
2 楼lizzz(不是程序员)回复于 2005-01-03 12:46:11 得分 0
最好的验证方法就是将这总现象放大,例如在remove 线程的同步之前加上一个延时。Top
3 楼zealVampire(白鹤泉)回复于 2005-01-03 14:06:24 得分 3
vector好像是方法同步, 去看看jdk/src里面vector代码
应该只是保证同一时刻只有一个线程调用一对象的一方法。Top
4 楼lizzz(不是程序员)回复于 2005-01-03 14:18:24 得分 0
对阿,所以它能够保证线程安全,但是对list加同步的方法。我认为并不能够实现真正的线程安全。Top
5 楼Achilles_KG(Razer Diamondback && Razer eXactMat)回复于 2005-01-03 15:18:21 得分 0
jdk/src?不好意思,问一jdk哪个版本开源了啊?我一直用的是1.4xTop
6 楼lizzz(不是程序员)回复于 2005-01-03 15:24:36 得分 0
所有版本,安装的时候好像可以选择是否安装源码。Top




