Uzun tip bir id
olan bir FooClass
kullandığınızı varsayalım:Oluşturulan bir anahtara göre iş parçacıkları arasında karşılıklı dışlama için Java'da genel bir çözüm var mı?
public class FooClass {
long id;
}
bir yöntem yoktur benzer imzayla ne olursa olsun sınıfı:
public void shouldBeSynchronizedForAFooClassId(long fooClassId) {
//does something
}
yapabileceğim Ne:
- Yöntemi senkronize edebilirim, ancak
FooClass
veid
1'den beri gereksiz bir darboğazdır veid
ileFooClass
2 problemsiz paralel çalışabilir. - Ben kimliğe sahip bir dize oluşturmak ve yapmak bunun bir stajyer(), ve bunu üzerinde senkronize olabilir olabilir Longs ile ilgili
- Senkronizasyon da iyi bir fikir değildir (bu fikrini sevmiyorum).
Map
numaralı anahtarı, anahtar olarak kimliği ve izlenenObject
değeri olarak oluşturabilirim. Bu durumda, izlenen Nesneleri artık herhangi bir iş parçacığı tarafından kullanılmadığı anda temizleyebilmek için, aynı izlenen Nesneyi kullanarak iş parçacıklarının sayısını kaydetmeye çalışmak zorundayım.- (yukarıda Uzun ile benim sonbaharda) türüyle generized bir LockManager ya da her türlü, olabilir: düşündüğümden
gibi bir hazır çözüm bulunmalıdır. Gerekirse, monitör nesnesinin oluşturulması da dahil olmak üzere, karşılıklı dışlanmayı kapsülleyecek ve daha sonra kaldıracak bir runSafely (Runnable run) yöntemi sağlayabilir. Tabii ki bu runSafely içinde id almak zorunda.
Bu kitaplıktaki kutunun dışında bir şey var mı? İhtiyacınız
FooClass örneğinin kendisini eşzamanlayamıyor musunuz (as kimliği eşlemelerini tek bir ilgili FooClass örneğiyle varsayarak)? Aksi takdirde, Guava'nın Çizgili sayfasına bakın: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/Striped.html –
@JBNizet fooClass üzerinde senkronizasyon yardımcı değildir, çünkü birkaç FooClass örnekleri JVM'de bulunabilir (kalıcılık katmanıyla yüklenir, farklı oturumlar tarafından değiştirilir veya kullanılır) –
Sonra Guava'nın Çizgisi muhtemelen sizin istediğiniz gibi olabilir. –