2011-03-09 27 views
6

Özel sınıf yükleyicimi yazıyorum ve iş parçacığı güvenli yapmam gerekip gerekmediğini merak ediyorum? Kolayca görebildiğiniz gibi, tüm yerel Java sınıf yükleyicileri iş parçacığı için güvenli değildir, sadece sun.misc.Launcher.AppClassLoader (ve OpenJDK kaynaklarını kontrol ettim ve OpenJDK'de değil).ClassLoader iş parçacığı güvenli midir?

Java sınıf çeviricileri senkronize edilmemesinin bir nedeni var mı? Özel sınıf yükleyiciler iş parçacığı güvenli midir?

+3

Hangi classloader öğesinin NOTafe safe olduğunu (ve evet bir ClassLoader iş parçacığı olmalıdır) – bestsss

+2

Senkronize kullanımı, bir iş parçacığının kendi başına güvenli bir şey yapmasına neden olmaz. Farklı JVM'lerin, birden fazla iş parçacığı ile aynı sınıf yükleyiciye sahip sınıfları yükledikleri düşünüldüğünde, kesinlikle threadafe olmak için iyi bir şekilde gösterildiğini söyleyebilirim. Threadfilety nasıl yapılır, ancak beklediğiniz şekilde olmayabilir. Aslında bir WebApp sınıf yükleyicisi uygulamak için – Yishai

cevap

2

ClassLoader.loadClass() senkronize edilmiştir.

Genellikle özel bir sınıf yükleyici bu yöntemi geçersiz kılmaz, ancak findClass() geçersiz kılabilir. findClass(), loadClass tarafından çağrıldığı ve bu nedenle senkronize edilmiş kritik bölümden çağrıldığından, senkronize edilmesine gerek yoktur.

+0

, loadClass geçersiz kılınmalıdır. Gerçekten eşitleme yöntemi şöyledir: özel senkronize Sınıf loadClassInternal (String name) 'olan (yıllardır) büyük sıkıntı oldu: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4670071 – bestsss

+0

I findCalss-> loadClass zincirini doğrudan arıyorum, varsayalım, loadClassInternal ile aynı nesne üzerinde senkronize edilmesi gerekir. Ben loadClassInternal çağrıları arkasında ne özellikleri olduğunu henüz öğrenmedim –

+0

Üzgünüz, sadece yeniden kontrol edildi, findClass * IS * senkronize edildi, bu yüzden sadece findClass'ı geçersiz kıldığım sürece, karışıklık yok. Teşekkürler! –

İlgili konular