Trong Java, bạn có thể xem xét hành vi của chương trình được đồng bộ hóa không chính xác không xác định.
Java 7 JLS sử dụng từ "không xác định" một lần, trong 17.4.8. Yêu cầu thực thi và quan hệ nhân quả :
Chúng tôi sử dụng f|d
để biểu thị chức năng nhất định bằng cách hạn chế các lĩnh vực f
để d
. Đối với tất cả x
trong d
, f|d(x) = f(x)
và cho tất cả x
không trong d
, khôngf|d(x)
được xác định ...
Tài liệu API Java chỉ định một số trường hợp khi kết quả không được xác định - ví dụ: trong hàm tạo (không dùng nữa) Ngày (int year, int tháng, int day) :
Kết quả là không xác định nếu một đối số nhất định nằm ngoài giới hạn ...
Javadocs cho trạng thái ExecutorService.invoke ALL (Bộ sưu tập) :
Kết quả của phương pháp này không được xác định nếu bộ sưu tập đã cho được sửa đổi trong khi thao tác này đang diễn ra ...
Ví dụ , loại hành vi "không xác định" ít chính thức hơn có thể được tìm thấy trong ConcurrencyModificationException , trong đó các tài liệu API sử dụng thuật ngữ "nỗ lực tốt nhất":
Lưu ý rằng hành vi không nhanh không thể được đảm bảo vì nói chung, không thể thực hiện bất kỳ đảm bảo cứng nào khi có sửa đổi đồng thời không đồng bộ. Hoạt động thất bại nhanh chóng ConcurrentModificationException
trên cơ sở nỗ lực tốt nhất . Do đó, sẽ là sai lầm khi viết một chương trình phụ thuộc vào ngoại lệ này vì tính chính xác của nó ...
ruột thừa
Một trong những ý kiến câu hỏi đề cập đến một bài viết của Eric Lippert cung cấp phần giới thiệu hữu ích về các vấn đề chủ đề: Hành vi được xác định theo thực hiện .
Tôi đề nghị bài viết này cho lý luận bất khả tri ngôn ngữ, mặc dù đáng lưu ý rằng tác giả nhắm mục tiêu C #, không phải Java.
Theo truyền thống, chúng tôi nói rằng một thành ngữ ngôn ngữ lập trình có hành vi không xác định nếu sử dụng thành ngữ đó có thể có bất kỳ ảnh hưởng nào; nó có thể hoạt động theo cách bạn mong đợi hoặc nó có thể xóa đĩa cứng hoặc làm hỏng máy của bạn. Hơn nữa, tác giả trình biên dịch không có nghĩa vụ cảnh báo bạn về hành vi không xác định. (Và trên thực tế, có một số ngôn ngữ trong đó các chương trình sử dụng thành ngữ "hành vi không xác định" được đặc tả ngôn ngữ cho phép để phá vỡ trình biên dịch!) ...
Ngược lại, một thành ngữ có hành vi được xác định thực hiện là hành vi trong đó tác giả trình biên dịch có một số lựa chọn về cách triển khai tính năng và phải chọn một hành vi. Như tên ngụ ý, hành vi được xác định thực hiện ít nhất là được xác định. Ví dụ, C # cho phép thực hiện ném ngoại lệ hoặc tạo giá trị khi phân chia số nguyên tràn, nhưng việc triển khai phải chọn một ngoại lệ. Nó không thể xóa đĩa cứng của bạn ...
Một số yếu tố dẫn đến một ủy ban thiết kế ngôn ngữ để lại các thành ngữ ngôn ngữ nhất định là hành vi không xác định hoặc xác định thực hiện là gì?
Yếu tố chính đầu tiên là: có hai triển khai ngôn ngữ hiện có trên thị trường không đồng ý về hành vi của một chương trình cụ thể không? ...
Yếu tố chính tiếp theo là: tính năng này có tự nhiên thể hiện nhiều khả năng khác nhau để thực hiện không, một số trong đó rõ ràng tốt hơn các tính năng khác? ...
Một yếu tố thứ ba là: tính năng này phức tạp đến mức việc phân tích chi tiết hành vi chính xác của nó sẽ khó khăn hoặc tốn kém để chỉ định? ...
Một yếu tố thứ tư là: tính năng có đặt ra gánh nặng lớn cho trình biên dịch để phân tích không? ...
Một yếu tố thứ năm là: tính năng có đặt ra gánh nặng cao cho môi trường thời gian chạy không? ...
Một yếu tố thứ sáu là: làm cho hành vi được xác định loại trừ một số tối ưu hóa chính? ...
Đó chỉ là một vài yếu tố xuất hiện trong tâm trí; tất nhiên có nhiều, rất nhiều yếu tố khác mà các ủy ban thiết kế ngôn ngữ tranh luận trước khi thực hiện một tính năng "triển khai được xác định" hoặc "không xác định".
Trên đây chỉ là một phạm vi bảo hiểm rất ngắn gọn; bài báo đầy đủ chứa các giải thích và ví dụ cho các điểm được đề cập trong đoạn trích này; nó rất đáng đọc Ví dụ, các chi tiết được đưa ra cho "yếu tố thứ sáu" có thể giúp người ta hiểu rõ hơn về động lực cho nhiều câu lệnh trong Mô hình bộ nhớ Java ( JSR 133 ), giúp hiểu tại sao một số tối ưu hóa được cho phép, dẫn đến hành vi không xác định trong khi các hành vi khác bị cấm, dẫn đến những hạn chế như xảy ra trước và yêu cầu nhân quả .
Không có tài liệu bài viết nào đặc biệt mới đối với tôi nhưng tôi sẽ bị nguyền rủa nếu tôi từng thấy nó được trình bày theo cách thanh lịch, dễ hiểu và dễ hiểu như vậy. Kinh ngạc.