我认为,所有获得价值的方式都是正确的,但我想问一下。 lockedList
是ArrayList
,我只想要一个线程来获取值。
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;
}
我忘了添加:我知道最好的方法是使用现成的同步容器。我问我写的礼貌是否正确。
答案 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)
这三个都是正确的。只需要读取共享变量即可。将它应用于局部变量或直接返回具有相同的线程安全语义。