2012-05-02 34 views
5

Khi tôi đang giao dịch với chủ đề khái niệm trong Java, tôi đã thấy tệp nguồn Thread.java. Tôi nhận thấy khi phương pháp setName() gán chuỗi cho một mảng ký tự gọi là "name[]". Java có một tính năng của kiểu dữ liệu String, sau đó tại sao chúng sử dụng mảng ký tự.tại sao setName trong lớp Thread gán cho một mảng ký tự? Tại sao không phải là một String?

Trong file nguồn nó được khởi tạo như thế nào,

private char name[]; // why not "private String name;" 

Trong setName() phương pháp,

public final void setName(String name) { 
    checkAccess(); 
    this.name = name.toCharArray(); 
    } 

Xin hãy giúp tôi. Cảm ơn trước.

Trả lời

9

Tên này được truy cập từ mã gốc, vì vậy việc xử lý mảng char dễ dàng hơn mangle với các loại Java. Danh sách gửi thư core-lib-devs đã thảo luận câu hỏi này một thời gian trước đây, đây là một link đến một thư từ chuỗi. Câu hỏi ban đầu nói rằng "một số tiền hợp lý của thời gian đi đến đó Thread.setName gọi mà tôi tin rằng một phần đáng kể là để làm phân bổ char mới và sao chép mảng char vv". Trích dẫn bit của câu trả lời:

Có một RFE cho cách này trở lại vào cuối năm 2002:

4.745.629 (thread) Thread.setName không phân bổ chuỗi không cần (không sử dụng char [])

các eval ban đầu vào năm 2002 nêu rõ:

"tôi không thể tưởng tượng rằng đây nghiêm trọng ảnh hưởng hiệu suất của bất kỳ chương trình thực Hơn nữa, việc thay đổi các trường trong chủ đề là có vấn đề do mối quan hệ thân thiết. tàu của lớp này với VM. Điều đó nói rằng, nó có thể là giá trị địa chỉ này trong bối cảnh của một số Chủ đề mã dọn dẹp "

Sau đó vào năm 2005 nó đã được đóng cửa là 'sẽ không giải quyết được.':

" Có phụ thuộc vào tên đại diện là một mảng char trong JVM và RFE này phải bị từ chối trân trọng "

+2

Bạn có thể sao lưu dữ liệu đó bằng một số tham chiếu hay gì đó không? Tôi không thấy bất cứ điều gì trong 'Thread.java' hoặc' Thread.c' (trong cây 'native') làm cho tên có thể truy cập được tới mã gốc. Nếu nó được truy cập từ mã nguồn gốc, tôi hy vọng sẽ thấy một ký tự null ở cuối. Điều này có vẻ như đầu cơ. –

+0

Đó là phản ứng tuyệt vời, cảm ơn bạn. tôi có thể xem xét, nó là một trong những lý do, java không phải là ngôn ngữ hướng đối tượng thuần túy? – kik

+1

@kik: ** toàn bộ ** "là ngôn ngữ OO thuần túy", câu hỏi là ** vô dụng ** vì không ai hỏi nó có thể cung cấp định nghĩa hữu ích về chính xác ngôn ngữ OO thuần túy. Tôi rất muốn được chứng minh là sai, nhưng cho đến nay nó vẫn chưa xảy ra. –

4

tôi nghĩ rằng điều này rất có thể là một vật lịch sử;. tức là cái gì đó đã được thực hiện từ lâu rồi vì những lý do không còn

Như bình luận của Curtisk cho biết, nó đã được gợi ý rằng điều này được cố định. Nhưng có vẻ như những ý tưởng đã được đặt ở một bên vì nỗ lực để sửa lỗi vượt quá lợi ích. Và nó là khá rõ ràng rằng lợi ích của việc sửa chữa này anomoly là miniscule ... trừ khi bạn đang tạo ra rất nhiều chủ đề mà làm ít công việc thực sự.

Các RFE (4.745.629) là không hiển thị với Google, nhưng this mailing list posting David Holmes @ Oracle đề cập đến nó:

Xiaobin Lu nói như sau về 08/11/10 08:07:

Cảm ơn bạn đã trả lời. Đối với nhiều ứng dụng doanh nghiệp (chẳng hạn như một ứng dụng tôi làm), một khoảng thời gian hợp lý sẽ được chuyển đến Chủ đề đó.setName gọi mà tôi tin rằng một phần đáng kể là làm phân bổ char mới và sao chép mảng char v.v ... Vì vậy, tôi nghĩ chúng ta nên suy nghĩ thứ hai về cách chúng tôi có thể lưu trữ hiệu quả trường đó.

Có một RFE cho cách này trở lại vào cuối năm 2002:

4.745.629 (thread) Thread.setName không phân bổ chuỗi không cần thiết (không sử dụng char [])

Các eval ban đầu vào năm 2002 đã nêu:

"Tôi không thể tưởng tượng được điều này ảnh hưởng nghiêm trọng đến hiệu suất của bất kỳ chương trình thực sự nào . Hơn nữa, việc thay đổi các trường trong Chủ đề có vấn đề là đến mối quan hệ chặt chẽ của lớp này với t anh ta. Điều đó nói rằng, nó thể là giá trị địa chỉ này trong bối cảnh của một số đề tài mã dọn dẹp "

Sau đó vào năm 2005 nó đã được đóng cửa là 'sẽ không giải quyết được.':

" Có phụ thuộc vào các đại diện tên trở thành một mảng char trong JVM và RFE này phải bị từ chối trân trọng."


Thay đổi cả VM và mã Java được, như bạn đã biết, một nỗi đau thực sự để phối hợp, do đó sẽ phải là một số hiệu suất hấp dẫn bằng chứng để hỗ trợ cổng này (giả sử nó có thể được thay đổi). Cá nhân tôi đồng ý với eval ban đầu ở trên - nếu setName ảnh hưởng đến hiệu suất tổng thể của bạn thì chủ đề của bạn không thể thực hiện quá nhiều công việc thực tế và bạn dường như đang tạo quá nhiều chủ đề - vì vậy tôi muốn được quan tâm ở đây nhiều hơn về bối cảnh trong đó điều này xảy ra.

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