嗨,我在以下代码段中极大地简化了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块)来保护该段,但是ReadWriteLock更好吗?

最佳答案

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

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

您可以在contains代码周围加上“读取”锁定,并且如果要进行大量重复工作,那将是有意义的。但是,如果这是对罕见情况的一种健全检查,而不是您工作的主要驱动力(即,测试将在绝大多数时间通过),那么在这种情况下就没有理由进行读锁定了。只需锁定整个部分并完成即可。

07-24 09:36