您如何确保数据结构的互斥?

时间:2015-04-01 05:01:57

标签: java multithreading concurrency

当我们谈论数据结构时,我听到适用于变量的相同规则不适用。这是真的吗?

例如,这是完全没法的

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}

并不意味着以下内容能够完美运作。

public class SynchronizedDataStructures {
    private ArrayList<String> c = new ArrayList<String>();

    public synchronized void add1(element) {
        c.add(element);
    }

    public synchronized void clear1() {
        c.clear();
    }

    public synchronized int value() {
        return c;
    }
}

这是真的,我该怎么做才能使它适用于数据结构?

2 个答案:

答案 0 :(得分:1)

如果您将add1(element)更改为add1(String element),并删除value()方法,则会进行编译,并且是线程安全的。

您需要一种正确访问列表内容的方法。 e.g。

public synchronized int value(int index) {
    return c.get(index);
}

答案 1 :(得分:1)

有一种更简洁的方法可以同步对象,而不是完整的方法。考虑一下:

...
    public void clear1() {
        synchronized(c) {
            c.clear();
        }
    }
...

http://tutorials.jenkov.com/java-concurrency/synchronized.html

这是Java中synchronized的一个很好的解释。

相关问题