正确的获得价值的方式

时间:2013-12-02 16:42:18

标签: java concurrency

我认为,所有获得价值的方式都是正确的,但我想问一下。 lockedListArrayList,我只想要一个线程来获取值。

public T get1(int index)
{
    lock.lock();
    try
    {
        return lockedList.get(index);
    }
    finally
    {
        lock.unlock();
    }
}

public T get2(int index)
{
    lock.lock();
    try
    {
        T t = lockedList.get(index);
        return t;
    }
    finally
    {
        lock.unlock();
    }
}

public T get3(int index)
{
    lock.lock();
    T t = null;
    try
    {
        t = lockedList.get(index);
    }
    finally
    {
        lock.unlock();       
    }
    return t;
}

我忘了添加:我知道最好的方法是使用现成的同步容器。我问我写的礼貌是否正确。

5 个答案:

答案 0 :(得分:2)

它是正确的,但你需要改变一件事。而不是数组列表使用CopyOnWriteArrayList。这样你根本不必担心同步。查看这篇文章http://walivi.wordpress.com/2013/08/24/concurrency-in-java-a-beginners-introduction/

答案 1 :(得分:2)

您可以使用阻止队列来更加规范地解决此问题:http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html

这是您通常想要使用的内容。或者,如果要完全同步列表,请使用Collections.synchronizedList,不要实现自己的列表。否则,您的代码对我来说是正确的。

答案 2 :(得分:1)

您的代码在所有三个实例中都能正确执行 - 它在访问之前锁定lock,并在finally子句中将其解锁,从而保护列表本身。挑选版本取决于您的个人喜好。

由于您始终使用相同的方法锁定和解锁锁定,因此您可以使用synchronize简化此代码:

private final Object theLock = new Object();
...
public T get1(int index) {
    synchronized(theLock) {
        return lockedList.get(index);
    }
}

但请注意,如果T恰好是可变的,那么您的代码及其修改后的版本都不会保护列表中的

答案 3 :(得分:1)

我会说他们可以在运行时通过基本优化导致完全相同的代码,因此它们必须在功能上等效。

就个人而言 - 我更喜欢get1,因为它简洁明了。

答案 4 :(得分:1)

这三个都是正确的。只需要读取共享变量即可。将它应用于局部变量或直接返回具有相同的线程安全语义。