2010-03-18 40 views
5

Cho phép giả định sau lớp học định nghĩa:Lớp Java có được khởi tạo bởi chuỗi sử dụng nó lần đầu tiên không?

public class A { 
    public final static String SOME_VALUE; 

    static { 
     SOME_VALUE = "some.value"; 
    } 
} 

public class B { 
    private final String value = A.SOME_VALUE; 
} 

Giả sử rằng lớp A đã không được nạp chưa, những gì xảy ra khi đối tượng của lớp B được khởi tạo bởi một số chủ đề T? Lớp A phải được nạp và khởi tạo trước. Nhưng câu hỏi của tôi là: nếu nó được thực hiện trong bối cảnh của chủ đề T, hay đúng hơn là trong ngữ cảnh của một số chủ đề khác (đặc biệt) "trình nạp lớp"?

Trả lời

4

Không có chủ đề đặc biệt cho các lớp tải. Nó sẽ xuất phát từ chuỗi đề cập đến lớp lần đầu tiên. Phương thức ClassLoader.loadClass được đồng bộ hóa để nhiều luồng cố tải cùng một lớp không can thiệp.

EDIT Mã để liệt kê

public class Arbit { 
    public static void main(String[] args) throws Exception{ 
     B b1 = new B("1"); 
     B b2 = new B("2"); 
     B b3 = new B("3"); 
     b1.start(); 
     b2.start(); 
     b3.start(); 
     b1.join(); 
     b2.join(); 
     b3.join(); 
    } 
} 

class B extends Thread{ 
    B(String s){ 
     setName(s); 
    } 
    @Override 
    public void run() { 

     try { 
      Thread.sleep(new Random().nextInt(100)); 
     } catch (InterruptedException e) { 
     } 
     System.out.println(A.s); 
    } 
} 

class A{ 
    static String s = Thread.currentThread().getName(); 
} 
+0

Tôi tin rằng từ JDK7 bạn có thể có hai lớp học từ cùng một trình nạp lớp khởi tạo cùng một lúc. –

+0

@Tom Nhưng điều đó có gây ra vấn đề không, ví dụ: nếu bằng phương thức equals, tôi đặt this.getClass() == obj.getClass() – saugata

+0

Mỗi lớp riêng lẻ sẽ được khởi tạo một lần, nhưng có thể có nhiều lớp khác nhau trong cùng một trình nạp lớp được khởi tạo cùng một lúc. Điều này hiện không thể xảy ra do khóa được ghi chú trong câu trả lời của bạn. (Tôi nghĩ rằng điều này là đúng.) –

5

Hãy xem phần 12.4.1 ("Khi khởi Xảy ra") và 12.4.2 ("Thủ tục khởi Chi tiết") của JLS:

Các quy trình khởi tạo lớp hoặc giao diện như sau:

  1. Đồng bộ hóa (§14.19) trên đối tượng Lớp đại diện cho lớp hoặc giao diện được khởi tạo. Điều này liên quan đến việc chờ cho đến khi luồng hiện tại có thể lấy khóa cho đối tượng đó (§17.1).
  2. Nếu quá trình khởi tạo đang diễn ra cho lớp hoặc giao diện của một số chủ đề khác, hãy chờ đối tượng Lớp này (tạm thời nhả khóa). Khi luồng hiện tại tỉnh lại, hãy lặp lại bước này.
  3. Nếu quá trình khởi tạo đang diễn ra cho lớp hoặc giao diện theo luồng hiện tại, thì đây phải là yêu cầu đệ quy để khởi tạo. Nhả khóa trên đối tượng Class và hoàn thành bình thường.
  4. Nếu lớp học hoặc giao diện đã được khởi tạo, thì bạn không cần thực hiện thêm hành động nào. Nhả khóa trên đối tượng Class và hoàn thành bình thường.
    ...

Các đặc điểm kỹ thuật nói rằng khởi xảy ra trong thread hiện hành (có nghĩa là bất cứ điều gì đề đạt một trạng thái mà gây ra sự cần thiết phải khởi tạo các lớp trong câu hỏi) nhưng điều đó thực hiện JVM phải thực hiện một số khá đảm bảo đồng bộ hóa nghiêm ngặt để tránh mọi vấn đề.

+0

+1 để tham chiếu JLS – medopal

Các vấn đề liên quan