Java 同步和集合

标签 java multithreading concurrency synchronization synchronized-block

如果一个同步代码块包含一个非同步集合。该集合是否被认为是线程安全的?如果没有,您能否提供两个线程可能不安全地访问同步代码中的集合的任何实际场景?

谢谢。

最佳答案

这是一个非常简单的对象,一个无界队列,我在这里的另一个例子中使用了它:

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/

相关文章:

java - @Fetch(FetchMode.SELECT) 和 fetch = FetchType.LAZY 的区别

assembly - 迷你操作系统中针对不同信号量的现成队列的优缺点

java - 并发: Designing a REST API using Play Framework/Akka

java - Camera.takePicture() 之后没有调用任何回调

java - JAXB 和抽象类

java - swingWorker调用的synchronized方法被中断?

multithreading - 在C++ 0x中创建一个在调用线程之前获取互斥量的线程

java - 在循环中调用可中断的阻塞方法

java - ForkJoinPool中的辅助线程是守护程序线程吗?

java - LinkedHashSet 不主要插入顺序吗?