gpt4 book ai didi

java - 同步与读写锁

转载 作者:行者123 更新时间:2023-12-01 09:21:03 25 4
gpt4 key购买 nike

嗨,我在下面的代码片段中极大地简化了 java 问题

public class WhichJavaSynchroIsBestHere {

private BlockingQueue<CustomObject> queue = new PriorityBlockingQueue<CustomObject>();

public void add( CustomObject customO ) {

// The custom objects do never have the same id
// so it's no horizontal concurrency but more vertical one a la producer/consumer
if ( !queue.contains( customO ) ) {
// Between the two statement a remove can happen
queue.add( customO );
}
}

public void remove( CustomObject customO ) {
queue.remove( customO );
}

public static class CustomObject {
long id;
@Override
public boolean equals( Object obj ) {
if ( obj == null || getClass() != obj.getClass() )
return false;
CustomObject other = (CustomObject) obj;
return ( id == other.id;
}
}
}

因此,这更多的是生产者/消费者问题,因为调用 add 的两个线程可能不会传递相同的 Customobject (id),但是当一个线程使用相同的对象调用 add 时,可能会发生这种情况第二个线程调用remove。 if 条件和添加之间的代码部分在我看来不是线程,安全的,我正在考虑对象 Lock (没有 synchronized block )来保护该部分,但它是一个 ReadWriteLock 更好吗?

最佳答案

这没有什么区别,因为无论如何这两个部分都需要写锁。

ReadWriteLock 的优点是可以轻松地允许多个 Reader 进行共享访问,并且与需要独占写入访问权限的人很好地合作。

您可以使用读取锁包围 contains 代码,如果放入潜在的重复项是您的大部分工作,那么这将是有意义的。但是,如果它更多的是对罕见边缘情况的健全性检查,而不是工作的主要驱动因素(即测试将在绝大多数时间通过),那么在这种情况下就没有理由使用读锁。只需锁定整个部分即可完成。

关于java - 同步与读写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com