Trong ứng dụng của tôi, có một lớp như dưới đây:Lớp khởi và đồng bộ phương pháp lớp
public class Client {
public synchronized static print() {
System.out.println("hello");
}
static {
doSomething(); // which will take some time to complete
}
}
Lớp này sẽ được sử dụng trong một môi trường đa chủ đề, nhiều chủ đề có thể gọi phương thức Client.print() đồng thời . Tôi tự hỏi nếu có bất kỳ cơ hội mà thread-1 kích hoạt khởi tạo lớp, và trước khi khởi tạo lớp hoàn thành, thread-2 nhập vào phương thức in và in ra chuỗi "hello"?
Tôi thấy hành vi này trong hệ thống sản xuất (64 bit JVM + Windows 2008R2), tuy nhiên, tôi không thể sao chép hành vi này bằng chương trình đơn giản trong mọi môi trường.
Trong ngôn ngữ Java spec, phần 12.4.1 (http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html), nó nói:
Một loại hoặc loại giao diện T sẽ được khởi tạo ngay trước khi xảy ra lần đầu tiên của bất kỳ một trong những điều sau:
- T là một lớp và một thể hiện của T được tạo.
- T là một lớp và một phương thức tĩnh được khai báo bởi T được gọi.
- Trường tĩnh được khai báo bằng T được gán.
- Trường tĩnh được khai báo bằng T được sử dụng và tham chiếu đến trường không phải là hằng số biên dịch (§15.28). Các tham chiếu đến các hằng số biên dịch thời gian phải được giải quyết tại thời gian biên dịch thành một bản sao của giá trị hằng số thời gian biên dịch, vì vậy việc sử dụng một trường như vậy không bao giờ gây ra khởi tạo.
Theo văn bản này, việc khởi tạo lớp sẽ diễn ra trước khi gọi của phương pháp tĩnh, tuy nhiên, nó không phải là rõ ràng nếu khởi tạo lớp cần phải được hoàn trước khi gọi của phương pháp tĩnh . JVM nên ủy nhiệm hoàn thành việc khởi tạo lớp trước khi nhập phương thức tĩnh của nó theo trực giác của tôi và một số thử nghiệm của tôi hỗ trợ phỏng đoán của tôi. Tuy nhiên, tôi đã nhìn thấy hành vi ngược lại trong một môi trường khác. Ai đó có thể cho tôi một số ánh sáng về điều này?
Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn.
Trình khởi tạo tĩnh là một phương thức lớp đơn giản được gọi dưới khóa (trình nạp lớp học). –
bestsss