如果一个同步代码块包含一个非同步集合。该集合是否被认为是线程安全的?如果没有,您能否提供两个线程可能不安全地访问同步代码中的集合的任何实际场景?
谢谢。
最佳答案
这是一个非常简单的对象,一个无界队列,我在这里的另一个例子中使用了它:
public final class MyQueue<T> {
private List<T> list = new ArrayList<T>();
public T take() {
synchronized(list) {
while (list.size() == 0) {
list.wait();
}
return list.remove(0);
}
}
public void put(T object) {
synchronized(list) {
list.add(object);
list.notifyAll();
}
}
}
这里封装了一个ArrayList,只能通过synchronized方法访问或修改(所有synchronized方法都使用同一个锁,就是ArrayList),所以是线程安全的。 ArrayList 的方法本身不同步并不重要。
关于Java 同步和集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14571143/