Di Java, Anda dapat mempertimbangkan perilaku program yang disinkronkan secara salah, tidak terdefinisi.
Java 7 JLS menggunakan kata "tidak terdefinisi" sekali, dalam 17.4.8. Eksekusi dan Persyaratan Kausalitas :
Kami menggunakan f|d
untuk menunjukkan fungsi yang diberikan dengan membatasi domain f
ke d
. Untuk semua x
di d
,, f|d(x) = f(x)
dan untuk semua yang x
tidak di d
, f|d(x)
tidak ditentukan ...
Dokumentasi Java API menetapkan beberapa kasus saat hasil tidak ditentukan - misalnya, dalam Tanggal konstruktor (tidak digunakan) (tahun int, bulan int, hari int) :
Hasilnya tidak ditentukan jika argumen yang diberikan di luar batas ...
Javadocs untuk ExecutorService.invokeAll (Koleksi) menyatakan:
Hasil dari metode ini tidak ditentukan jika koleksi yang diberikan dimodifikasi saat operasi ini sedang berlangsung ...
Jenis perilaku "tidak terdefinisi" yang kurang formal dapat ditemukan misalnya di ConcurrentModificationException , di mana dokumen API menggunakan istilah "upaya terbaik":
Perhatikan bahwa perilaku gagal-cepat tidak dapat dijamin karena, secara umum, tidak mungkin untuk membuat jaminan keras di hadapan modifikasi bersamaan yang tidak disinkronkan. Operasi Fail-cepat membuang ConcurrentModificationException
pada upaya terbaik dasar. Oleh karena itu, akan salah untuk menulis sebuah program yang bergantung pada pengecualian ini untuk kebenarannya ...
Lampiran
Salah satu komentar pertanyaan merujuk pada sebuah artikel oleh Eric Lippert yang memberikan pengantar yang bermanfaat ke dalam hal-hal topik: Perilaku yang ditentukan implementasi .
Saya merekomendasikan artikel ini untuk alasan bahasa-agnostik, meskipun perlu diingat bahwa penulis menargetkan C #, bukan Java.
Secara tradisional kami mengatakan bahwa idiom bahasa pemrograman memiliki perilaku yang tidak terdefinisi jika penggunaan idiom itu dapat memiliki efek apa pun; itu bisa bekerja seperti yang Anda harapkan atau bisa menghapus hard disk Anda atau crash mesin Anda. Selain itu, pembuat kompiler tidak berkewajiban untuk memperingatkan Anda tentang perilaku yang tidak terdefinisi. (Dan pada kenyataannya, ada beberapa bahasa di mana program yang menggunakan idiom "perilaku tidak terdefinisi" diizinkan oleh spesifikasi bahasa untuk membuat crash kompilator!) ...
Sebaliknya, idiom yang memiliki perilaku implementasi-didefinisikan adalah perilaku di mana penulis kompiler memiliki beberapa pilihan tentang bagaimana menerapkan fitur, dan harus memilih satu. Seperti namanya, perilaku implementasi-didefinisikan setidaknya didefinisikan. Misalnya, C # mengizinkan implementasi untuk melempar pengecualian atau menghasilkan nilai ketika divisi integer meluap, tetapi implementasi harus memilih satu. Itu tidak dapat menghapus hard disk Anda ...
Apa saja faktor-faktor yang menyebabkan komite desain bahasa untuk meninggalkan idiom bahasa tertentu sebagai perilaku yang tidak terdefinisi atau implementasi?
Faktor utama pertama adalah: apakah ada dua implementasi bahasa yang ada di pasar yang tidak setuju dengan perilaku program tertentu? ...
Faktor utama berikutnya adalah: apakah fitur secara alami menghadirkan banyak kemungkinan berbeda untuk implementasi, beberapa di antaranya jelas lebih baik daripada yang lain? ...
Faktor ketiga adalah: apakah fitur itu begitu rumit sehingga rincian rincian perilaku tepatnya akan sulit atau mahal untuk ditentukan? ...
Faktor keempat adalah: apakah fitur memaksakan beban tinggi pada kompiler untuk dianalisis? ...
Faktor kelima adalah: apakah fitur memberlakukan beban tinggi pada lingkungan runtime? ...
Faktor keenam adalah: apakah membuat perilaku yang didefinisikan menghalangi beberapa optimasi utama? ...
Itu hanya beberapa faktor yang muncul di pikiran; tentu saja ada banyak, banyak faktor lain yang diperdebatkan komite desain bahasa sebelum membuat fitur "implementasi didefinisikan" atau "tidak terdefinisi".
Di atas hanya liputan yang sangat singkat; artikel lengkap berisi penjelasan dan contoh untuk poin-poin yang disebutkan dalam kutipan ini; itu sangat berharga untuk dibaca. Misalnya, perincian yang diberikan untuk "faktor keenam" dapat memberikan satu wawasan tentang motivasi untuk banyak pernyataan dalam Java Memory Model ( JSR 133 ), membantu untuk memahami mengapa beberapa optimasi diizinkan, mengarah pada perilaku yang tidak ditentukan sementara yang lain dilarang, yang mengarah ke keterbatasan seperti yang terjadi sebelum dan persyaratan kausalitas .
Tidak ada satu pun dari materi artikel yang baru bagi saya tetapi saya akan terkutuk jika saya pernah melihatnya disajikan dengan cara yang begitu elegan, singkat dan mudah dimengerti. Luar biasa.