Java'da, yanlış senkronize edilmiş programın davranışını tanımsız olarak düşünebilirsiniz.
Java 7 JLS, 17.4.8'de bir kez "tanımsız" kelimesini kullanır . İnfazlar ve Nedensellik Gereksinimleri :
Biz kullanmak f|d
etki alanını kısıtlayarak verilen işlevi belirtmek için f
için d
. Hepsi için x
in d
, f|d(x) = f(x)
herkes için, ve x
değil d
, f|d(x)
bir tanımsız ...
Java API belgeleri, sonuçların tanımsız olduğu bazı durumları belirtir (örneğin, (kullanımdan kaldırıldı) yapıcı Tarihinde (int yıl, int ay, int gün) :
Belirli bir argüman sınırların dışındaysa sonuç tanımsızdır ...
ExecutorService.invokeAll (Koleksiyon) durumu için Javadocs :
Bu işlem devam ederken verilen koleksiyon değiştirilirse , bu yöntemin sonuçları tanımlanmamıştır ...
API biçiminin "en iyi çaba" terimini kullandığı ConcurrentModificationException içinde daha az biçimsel "tanımsız" davranış türü bulunabilir :
Başarısız davranışların, senkronize olmayan eşzamanlı modifikasyon varlığında herhangi bir kesin garanti vermenin imkansız olduğu için garanti edilemeyeceğini unutmayın. Fail-hızlı operasyonlar atmak ConcurrentModificationException
bir üzerinde en çok çaba bazında. Bu nedenle, doğruluğu nedeniyle bu istisnaya bağlı bir program yazmak yanlış olur ...
apandis
Soru yorumlarından biri, Eric Lippert'in konu konularına yararlı bir giriş sağlayan bir makalesine atıfta bulunur: Uygulama tanımlı davranış .
Bu makaleyi dil-agnostik muhakeme için öneriyorum, ancak yazarın Java'yı değil C # 'ı hedeflediğini akılda tutmaya değer.
Geleneksel olarak, eğer bu deyimin kullanımının herhangi bir etkisi olabiliyorsa , bir programlama dili deyiminin tanımlanmamış davranışa sahip olduğunu söyleriz ; beklediğiniz şekilde çalışabilir veya sabit diskinizi silebilir veya makinenizi kilitleyebilir. Ayrıca, derleyici yazarı, tanımlanmamış davranış konusunda sizi uyarmakla yükümlü değildir. (Ve aslında, "tanımlanmamış davranış" deyimlerini kullanan programların, dil belirtimi tarafından derleyiciyi çökmesine izin verdiği bazı diller vardır!) ...
Buna karşılık, uygulama tanımlı davranışa sahip bir deyim , derleyici yazarının özelliğin nasıl uygulanacağı konusunda çeşitli seçeneklere sahip olduğu ve bir tanesini seçmesi gereken davranıştır. Adından da anlaşılacağı gibi, uygulama tanımlı davranış en azından tanımlanır. Örneğin, C #, bir tamsayı bölümü taştığında bir uygulamanın bir istisna atmasına veya bir değer üretmesine izin verir, ancak uygulamanın bir tane seçmesi gerekir. Sabit diskinizi silemez ...
Bir dil tasarım komitesinin belirli dil deyimlerini tanımsız veya uygulama tanımlı davranışlar olarak bırakmasına neden olan faktörlerden bazıları nelerdir?
İlk önemli faktör: pazarda belirli bir programın davranışına katılmayan iki dil uygulaması var mı? ...
Bir sonraki önemli faktör: özellik doğal olarak bazıları diğerlerinden açıkça daha iyi olan birçok farklı uygulama olanağı sunuyor mu? ...
Üçüncü faktör: özellik o kadar karmaşık mı? ...
Dördüncü faktör: özellik derleyici üzerinde analiz etmek için yüksek bir yük oluşturuyor mu? ...
Beşinci faktör şudur: özellik çalışma zamanı ortamına yüksek bir yük getirir mi? ...
Altıncı faktör şudur: Tanımlanan davranışın yapılması bazı büyük optimizasyonları engelliyor mu? ...
Bunlar akla gelen birkaç faktördür; Elbette, dil tasarım komitelerinin "uygulama tanımlı" veya "tanımsız" bir özellik yapmadan önce tartıştığı pek çok başka faktör vardır.
Yukarıda sadece çok kısa bir kapsam vardır; makalenin tamamı bu alıntıda belirtilen noktalar için açıklamalar ve örnekler içermektedir; öyle çok okunmaya değer. Örneğin, "altıncı faktör" için verilen ayrıntılar, Java Bellek Modeli'ndeki ( JSR 133 ) birçok ifade için motivasyon hakkında bir fikir verebilir ve bazı optimizasyonlara neden izin verildiğini anlamaya yardımcı olurken, diğerleri yasaklanırken tanımlanmamış davranışa neden olur. önceden gerçekleşme ve nedensellik gereksinimleri gibi sınırlamalar .
Makale malzemelerinin hiçbiri benim için özellikle yeni değil, ancak böyle zarif, özlü ve anlaşılır bir şekilde sunulduğunu görürsem lanetleneceğim. İnanılmaz.