CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN Java Tại sao bạn nên tránh sử dụng Finalizer và Cleaner này được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Trình hoàn thiện trước java9, java9 sử dụng trình dọn dẹp thay vì trình hoàn thiện. So với trình hoàn thiện, trình dọn dẹp (tồn tại trong một lớp Cleaner độc lập và có thể được đưa vào lớp tương ứng khi cần) không gây ô nhiễm API và trình dọn dẹp có thư viện lớp để kiểm soát luồng của nó (cả hai đều được thực thi trong các luồng nền).
Những lý do nên tránh:
sự bất ổn về hành vi
Cả hai đều không đảm bảo việc thực thi kịp thời. Thời gian từ khi có thể truy cập được phương thức (đối tượng bị rỗng) cho đến lần thực thi cuối cùng dài tùy ý. Vì vậy, đừng bao giờ sử dụng chúng để cập nhật trạng thái liên tục quan trọng, chẳng hạn như giải phóng tài nguyên luồng, khóa phân tán, v.v.
Hai phương thức System.gc và System.runFinalization sẽ tăng cơ hội thực thi trình hoàn thiện và trình dọn dẹp, nhưng không có gì đảm bảo rằng chúng sẽ được thực thi. Hai phương pháp duy nhất có thể đảm bảo rằng nó sẽ được thực thi (System.runFinalizersOnExit và Runtime.runFinalizersOnExit) có những sai sót nghiêm trọng và đã không được dùng nữa trong một thời gian dài.
vấn đề về tính di động
Các thuật toán thu thập rác vùng heap JVM khác nhau là khác nhau. Nếu chương trình phụ thuộc vào thời gian khi trình hoàn thiện hoặc trình dọn dẹp được thực thi thì hiệu suất của chương trình có thể hoàn toàn khác nhau.
Vấn đề về hiệu suất
Trình hoàn thiện và trình dọn dẹp có ảnh hưởng rất nghiêm trọng đến hiệu suất.
Câu hỏi bảo mật
- Nếu một ngoại lệ xảy ra trong bộ hoàn thiện, luồng sẽ chấm dứt, nhưng dấu vết luồng sẽ không được in hoặc thậm chí cảnh báo sẽ không được in và đối tượng bị hủy sẽ ở trạng thái bị hủy nếu một luồng khác sử dụng đối tượng trong điều này. trạng thái bị phá hủy thì hành vi sẽ không chắc chắn về giới tính. Người dọn dẹp không có vấn đề này.
- Tấn công hoàn thiện: Phương thức hoàn thiện sẽ có lợi khi xây dựng một đối tượng lớp con độc hại và gọi bất hợp pháp phương thức lớp cha. Các lớp cuối cùng sẽ không được phân lớp độc hại, vì vậy chúng sẽ không phải chịu các cuộc tấn công hoàn thiện. Đối với các lớp không phải là lớp cuối cùng, hãy ghi đè một phương thức hoàn thiện trống và sửa đổi nó bằng phương thức cuối cùng để ngăn chặn các cuộc tấn công hoàn thiện.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
công cộng
lớp học
Thử nghiệm{
riêng tư
Boolean
cờ =
ĐÚNG VẬY
;
công cộng
Thử nghiệm() {
nếu như
(lá cờ){
ném
mới
Ngoại lệ thời gian chạy(
"Không được phép tạo lại đối tượng"
);
}
}
công cộng
vô hiệu
nói() {
Hệ thống.out.println(
"DemoUtils.say"
);
}
}
lớp học
Demo2
mở rộng
Thử nghiệm{
công cộng
Demo2(){}
@Ghi đè
được bảo vệ
vô hiệu
hoàn thiện()
ném
Có thể ném {
cái này
.nói();
Hệ thống.thoát(
0
);
}
công cộng
tĩnh
vô hiệu
main(String[] args)
ném
Ngoại lệ bị ngắt {
thử
{
Bản trình diễn =
mới
Demo2();
demo.say();
}
nắm lấy
(Ngoại lệ e) {
Hệ thống.out.println(e);
}
Hệ thống. gc();
Chủ đề.ngủ(
5000
);
}
}
java.lang.RuntimeException: Không được phép giải trí đối tượng
DemoUtils.say
|
Hai công dụng:
mạng lưới an toàn
Khi chủ sở hữu tài nguyên quên sử dụng phương thức đóng, trình hoàn thiện và trình dọn dẹp có thể hoạt động như một mạng lưới an toàn. Mặc dù không có gì đảm bảo việc giải phóng tài nguyên kịp thời, nhưng tốt hơn là nên giải phóng nó muộn hơn là không bao giờ giải phóng nó. Việc sử dụng mạng lưới an toàn như vậy đòi hỏi phải cân nhắc cẩn thận xem liệu việc thanh lọc có xứng đáng với chi phí bỏ ra hay không. Do đó, mạng lưới an toàn đã được thêm vào một số triển khai AutoCloseable trong Java.
Đây là mã nguồn của FileOutputStream.

Tái chế các đối tượng ngang hàng cục bộ
Máy ngang hàng cục bộ: Phương thức gốc của hoạt động Java thực sự được ủy quyền cho một đối tượng ngang hàng cục bộ. Sau khi sử dụng xong, đối tượng Java sẽ được tái chế bởi GC. Tuy nhiên, đối tượng ngang hàng này không phải là một đối tượng Java và sẽ không được GC tái chế. Nếu hiệu suất của đối tượng này có thể chấp nhận được và không có tài nguyên nào cần được giải phóng kịp thời, bạn có thể sử dụng trình hoàn thiện hoặc trình dọn dẹp để tái chế nó. Nhưng nếu hiệu suất của thiết bị ngang hàng không thể chấp nhận được và nó có tài nguyên cần được chấm dứt ngay lập tức thì cần phải cung cấp một phương pháp chặt chẽ.
Trên đây là chi tiết về lý do tại sao bạn nên tránh sử dụng trình hoàn thiện và Trình dọn dẹp trong Java. Để biết thêm thông tin về việc tránh sử dụng trình hoàn thiện và Trình dọn dẹp trong Java, vui lòng theo dõi các bài viết liên quan khác của tôi! .
Liên kết gốc: https://www.cnblogs.com/chenxuyuan-liu/p/14591193.html.
Cuối cùng, bài viết này về lý do tại sao bạn nên tránh sử dụng trình hoàn thiện và Trình dọn dẹp trong Java kết thúc tại đây. Nếu bạn muốn biết thêm về lý do tại sao bạn nên tránh sử dụng trình hoàn thiện và Trình dọn dẹp trong Java, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục xem các bài viết liên quan. tất cả Hãy ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!