أنواع مختلفة من مجموعات الخيط الآمن في Java



0 Answers

من الممكن دمج الأداء contains() من HashSet مع الخصائص المرتبطة بالتزامن لـ CopyOnWriteArraySet باستخدام AtomicReference<Set> واستبدال المجموعة بأكملها في كل تعديل.

رسم التنفيذ:

public abstract class CopyOnWriteSet<E> implements Set<E> {

    private final AtomicReference<Set<E>> ref;

    protected CopyOnWriteSet( Collection<? extends E> c ) {
        ref = new AtomicReference<Set<E>>( new HashSet<E>( c ) );
    }

    @Override
    public boolean contains( Object o ) {
        return ref.get().contains( o );
    }

    @Override
    public boolean add( E e ) {
        while ( true ) {
            Set<E> current = ref.get();
            if ( current.contains( e ) ) {
                return false;
            }
            Set<E> modified = new HashSet<E>( current );
            modified.add( e );
            if ( ref.compareAndSet( current, modified ) ) {
                return true;
            }
        }
    }

    @Override
    public boolean remove( Object o ) {
        while ( true ) {
            Set<E> current = ref.get();
            if ( !current.contains( o ) ) {
                return false;
            }
            Set<E> modified = new HashSet<E>( current );
            modified.remove( o );
            if ( ref.compareAndSet( current, modified ) ) {
                return true;
            }
        }
    }

}
Question

يبدو أن هناك الكثير من التطبيقات والطرق المختلفة لإنشاء مجموعات خيط آمن في Java. بعض الأمثلة تشمل

1) CopyOnWriteArraySet

2) Collections.synchronizedSet (مجموعة)

3) ConcurrentSkipListSet

4) Collections.newSetFromMap (جديد ConcurrentHashMap ())

5) مجموعات أخرى تم إنشاؤها بطريقة مشابهة لـ (4)

تأتي هذه الأمثلة من نمط التزامن: مجموعة متزامنة في تطبيقات Java 6

هل يمكن لشخص ما أن يشرح ببساطة الاختلافات والمزايا وعيوب هذه الأمثلة وغيرها؟ أواجه مشكلة في فهم كل شيء ومستنداته من Java Std Docs.




Related