2013-10-29 20 views
9

ABA sorununu anlıyorum. Ama anlayamadığım bir şey: otomatik çöp toplama olan dillerde, sergilenemeyebilir. Sorularım:ABA kilitlenmemiş algoritmalarda

  • Otomatik çöp toplama işlemi ABA sorununu nasıl önler?
  • Javada mümkün mü ve evet ise nasıl?
  • Bunun olmasını önlemek mümkün mü? Otomatik çöp toplama etkinleştirildiğinde

cevap

6
  • , hiçbir iki nesne aynı referans ve ile tahsis edilebilir olduğu sürece orada bir referans 0 referans ardından büyük saymak nedeni de, aynı anda eş-var kendisi serbest bırakılmayacak ve tekrar kullanılmayacaktır.

    böylece birisi hala eski referansa sahipken, referans içeriğini farklı nesne için "nokta" olarak "değiştiremezsiniz".

2

Otomatik çöp toplama işlemi ABA sorununu nasıl önler? Herlihy Shavit tarafından "Çok İşlemcili Programlama Sanatı" konusuna bakın. Alıntı: Bu (özellikle ABA Sorunu), özellikle dinamik bellek algoritması gösterir.

Tabi ki, ABA Problemi Java'da görünebilir, ancak çoğu durumda sorun dinamik bellek algoritmasında ortaya çıktığı ve bu algoritmayı java uygulamasında sık sık kullanmadığınızdan, bu hatayı java'da görmeyeceksiniz. çok sık.

Javada mümkün mü ve evet ise nasıl? "Çok İşlemcili Programlama Sanatı" adlı kitap, kilit serbest eşzamanlı bir sıra için bellek telafisi ile ilgili bu sorun için Java'ya bir örnek verir.

Bunun olmasını önlemek mümkün mü? Fiyat: Bir değerin zaman içinde iki noktada aynı olmadığını test ederek ABA'dan kaçının, ancak bu noktalar arasında değerin değişip değişmediğini kontrol edin. Bunu yapmanın bir yolu, AtomicStampedReference

+1

Lütfen herkesin izleyebilmesi için yazıları buradan kitaptan verin. Ve bu URL'yi referans olarak verebilirsiniz. – Trying

+0

bu yardımcı olabilir http://cs.brown.edu/courses/cs176/ – arunmoezhi

+0

@Tmas Krieger Bu kibar cevap değil - "kitap okumak" – gstackoverflow

2

kullanmaktır. ABA sorunu çöp toplama için ortogonaldir. Örneğin, uygulamalar bağlantılı bir listeden nesneleri ücretsiz bir listeye taşıyabilir ve daha sonra bunları hemen geri alabilir. Bu nedenle, nesne yeniden kullanılmadan önce asla serbest bırakılmaz. Bununla birlikte, ABA sorunu şu şekilde olabilir:

Thread1: prevHead = head;

Thread2: prevHead = head; newHead = getFromFreeList(); if (cas (& head, prevHead, newHead)) addToFreeList (prevHead);

Thread3: prevHead = head; newHead = getFromFreeList(); // başarılı // thread2 cas tarafından 'serbest' aynı nesneyi (& kafa, prevHead, newHead) alın ve thread2

Thread1 tarafından kaldırıldı şeyi geri koymak: newHead = getFromFreeList(); if (cas (& head, prevHead, newHead)) addToFreeList (prevHead); // CAS, // 'den beri olmamalı, ancak baştaki' Thread3 'tarafından yapılan bir değişiklik.