日期:2014-05-20  浏览次数:20714 次

读java并行编程实践一书,对一个线程安全类的疑问
先贴代码

@ThreadSafe 
public class ImprovedList<T> implements List<T> { 
private final List<T> list; 
public ImprovedList(List<T> list) { this.list = list; } 
public synchronized boolean putIfAbsent(T x) { 
boolean contains = list.contains(x); 
if (contains) 
list.add(x); 
return !contains; 

public synchronized void clear() { list.clear(); } 
// ... similarly delegate other List methods 


作者说这个类是线程安全的,但是我始终不理解。我是这么想的:
该类的所有方法虽然已经进行了同步加锁操作,list也没有被发布出去。但是list始终是从外部传入的,
如果在该类外部对list进行操作,是没有进行同步的,这样我觉得仍然有线程问题啊?
不知道我理解的对不对,有没有人解答下?
------解决方案--------------------

这个类是线程安全说的是多个线程同时调用该类的对象是线程安全的

你说的情况已经不是调用该类的对象了,而是对变量进行修改

和这个类是线程安全没有矛盾
------解决方案--------------------
你说的是对的。

书上所说同步是指用那两个方法对list进行操作是同步的。

如果脱离这个,你直接操作list的add和remove,那肯定是存在问题的。