2013-03-31 25 views
5

İplik güvenli olduğundan emin olmak için java kodları üzerinden veri okuyorum.Java kaynak kodunu nasıl analiz edebilirim ve güvenli olduğundan emin olun

Anladığım gibi, yöntemdeki herhangi bir yerel değişken, yığın bellek adresine ait olduğundan, iş parçacığı için güvenlidir. Herhangi bir sınıf/örnek değişkenleri, yığın belleğe ait olduğu için iş parçacığı güvenli değil, diğer iş parçacığı tarafından paylaşılır.

Başparmak kuralına göre, sınıf değişkenlerine dokunan her yönteme bir senkronize anahtar sözcük koyabilirim.

Herhangi bir tutturma eklentisi veya çok iş parçacıklı sorunları analiz edip önleyebileceğim kurallar var mı?

+1

Evet. FindBugs böyle bir analizi yapabilir. Bakınız: http://stackoverflow.com/questions/2423266/thread-safety-framework – noahlz

+0

Sadece bir iş parçacığı tarafından oluşturulan ve yalnızca bu iş parçacığı tarafından başvurulan bir nesne örneği (örneğin, referansı yerel bir var), özünde değil Başka herhangi bir konu ile paylaşılır. –

+0

Diğer genel "kurallar/puanlar" nelerdir? – youcanlearnanything

cevap

5

Dünya parçacığı, iyi bir programcı için en dokunaklı şeylerden biridir. İş parçacığı sorunlarının her çözümü, bağlam hakkında büyük bilgi gerektirir. Herhangi bir eklenti, her zaman en uygun çözümü seçmek için yeterli "akıllı" olmaz.

Nitekim synchronized her olası çözümler yaklaşık% 5'ini temsil eder. Çok iyi düşünülmüş ve buna göre daha => daha fazla çalışılmış kompleksi temel büyük kilitleme kullanmaz eşzamanlı koleksiyonları, örneğin ConcurrentHashMap için düşünün .

, volatile düşünün herhangi bir kilitle yoluyla atomocity her türlü kaçınarak bariyer hafızasını sağlamak gerçekleştirmek için; atomisite onun rolü değildir, ancak bazı durumlarda, bu performansı artırmak için kaçınmak için harika olurdu. Her yazı sınıfına synchronized anahtar kelime koymak olurdu ........:)

Not;

nedenle, iplik-güvenliği için (bazı var olabilir bile) herhangi eklentileri unutmak ama beyin güven zayıf performans hakkında konuşmadan .t ...

0

Tutulmanın böyle bir eklenti sağlayacağını sanmıyorum. Yerel değişkenler ile birlikte Immutable nesneleri kullanmaya çalışın, ThreadLocals ve çoğu çok iş parçacığı konuları ele alınacaktır.

0

Kilitlenmeleri algılayabilen derleme zamanı araçları görmedim. Bu modellemek zor olurdu. Tek bildiğim, some people have tried.

Onları her zaman çalışma zamanında tespit edebilirsiniz. JMX Fasulyeleri, bu cevapta açıklandığı gibi kilitlenmemiş konuları gösterecek şekilde sorgulanabilir - Deadlock detection in Java.

1

İplik güvenliğini kesin olarak kontrol edecek bir şey olduğunu düşünmüyorum, findbugs gibi makul bir iş yapacak olan bazı araçlar var. bariz hataları bulmak.

Programcının, değişkenlerin veya referansların farklı iş parçacıklarına sızmamasını ve her bir iş parçacığının 'doğru' değerinin göründüğünden emin olmak için birden fazla iş parçacığında kullanıldığı durumlarda, programcıya çok fazla şey vardır. performanstan önce güvenlik için

Tasarım, bunu ihtiyaçlarınız için ince performans gösterdiğini fark olabilir ama karmaşıklığı ve potansiyel başarısızlık artırmak size optimizasyon koyarsanız, bu darboğaz olmak kadar sona olmayabilir.

Özellikle Java Concurrency In Practice okuma okumasını öneririm, Effective Java da yararlı bulabilirsin.

0

Yorumun biraz fazlası uzun.

Başparmak kuralına göre, sınıf değişkenlerine dokunan her yönteme bir senkronize anahtar sözcük koyabilirim.

Gerçekten değil - Vector sınıfını düşünün: senkronize edilir, ancak yineleme harici kilitleme gerektirir. Eşzamanlı bir uyarıcı, örneğin tüm koleksiyonun kilitlenmesine gerek kalmadan yinelemeye izin veren CopyOnWriteArrayList'dir.

Başkaları tarafından zaten yanıtlandığı gibi alt çizgi: her yerde synchronized eklemek o kadar kolay değildir. Sınıfın sözleşmesini kesin olarak analiz etmeniz ve sözleşmenin hala çok iş parçacığı durumunda yerine getirildiğinden emin olmanız gerekir.

1

ThreadSafe (http://www.contemplateltd.com/threadsafe, ücretsiz denemeler mevcuttur) sorunun tam olarak ne istediğini yapar. Apache JMeter ve K9Mail gibi açık kaynaklı uygulamalarda bulunan eşzamanlılık hatalarının örnekleri için bu InfoQ article'a bakın. Bir kullanıcının görüşü için bkz. Ivan Senic's blog. ThreadSafe's Wikipedia entry kısa bir özetini verir.

(Açıklanması. ÅŸan ticari bir araçtır ve ben düşünmek kurucularından, bunu üreten firma değilim)

İlgili konular