Fail Fast And Fail Safe Lặp lại trong Java: Sự khác biệt là gì?



Bài viết về 'Trình lặp lại an toàn nhanh và không thành công' sẽ giúp bạn so sánh chi tiết hai Trình lặp này với các ví dụ có liên quan.

hỗ trợ hai loại trình lặp, một loại đầu tiên bị lỗi nhanh và loại thứ hai là không an toàn. Những điều này đóng một vai trò quan trọng khi nói đến xử lý ngoại lệ trong Java. Trong bài viết này về 'Fail Fast And Fail Safe Iterator', chúng tôi sẽ phân tích hoạt động của hai trình vòng lặp cũng như sự khác biệt cơ bản giữa chúng.

Sau đây là những điểm sẽ được thảo luận trong bài viết này:





Trước khi đi vào giải thích chi tiết, chúng ta hãy tự làm quen với khái niệm Sửa đổi đồng thời.

Sửa đổi đồng thời

Khi một luồng đơn (hoặc nhiều luồng), lặp qua một tập hợp, nó có thể thay đổi cấu trúc của tập hợp, bằng cách thêm hoặc xóa phần tử trong tập hợp hoặc bằng cách cập nhật giá trị của phần tử tại một vị trí cụ thể. Quá trình này được gọi là sửa đổi đồng thời.



Chúng ta hãy nhanh chóng xem xét hai Hệ thống liên quan đến chủ đề ở trên, trước khi đi vào chi tiết của cùng một

Thất bại nhanh Sysetm:

Một hệ thống được gắn nhãn là hệ thống nhanh không thành công, nếu nó tắt ngay sau khi xảy ra lỗi. Các hoạt động bị hủy bỏ ngay lập tức và các lỗi hoặc lỗi được hiển thị.

Hệ thống an toàn không thành công:

Hệ thống được dán nhãn là hệ thống an toàn không thành công, nếu chúng tiếp tục hoạt động ngay cả sau khi lỗi hoặc lỗi đã xảy ra. Họ không hủy bỏ một hoạt động và ẩn các lỗi thay vì để lộ chúng.



Các trình lặp trong java cho phép chúng ta duyệt qua các đối tượng Bộ sưu tập. Các trình vòng lặp do Bộ sưu tập trả về không nhanh hoặc không an toàn về bản chất.

Bộ lặp nhanh không thành công

Các trình vòng lặp nhanh không thành công trong Java không cho phép bất kỳ kiểu sửa đổi cấu trúc nào đối với một tập hợp trong khi lặp qua nó. Sửa đổi cấu trúc bao gồm thêm, xóa hoặc cập nhật bất kỳ phần tử nào trong bộ sưu tập trong khi lặp lại nó. Trình lặp ném một ConcurrentModificationException, nếu một tập hợp được sửa đổi cấu trúc trong quá trình lặp.

Tuy nhiên, cần lưu ý rằng nếu một mục bị xóa bằng phương thức riêng của trình vòng lặp, tức là phương thức remove (), thì không có ngoại lệ nào được ném ra. Đó là một quá trình hoàn toàn an toàn. chắc chắn rằng bạn có java được cài đặt trên hệ thống của bạn

Ví dụ về Trình lặp nhanh không thành công:

import java.util.HashMap import java.util.Iterator import java.util.Map public class FailFastExample {public static void main (String [] args) {Map monthIndex = new HashMap () monthIndex.put ('1', 'January ') monthIndex.put (' 2 ',' Tháng 2 ') monthIndex.put (' 3 ',' Tháng 3 ') iterator iterator = monthIndex.keySet (). iterator () while (iterator.hasNext ()) {System.out .println (monthIndex.get (iterator.next ())) // thêm một phần tử vào Map // ngoại lệ sẽ được ném vào lần gọi tiếp theo // của phương thức next (). monthIndex.put ('4', 'April')}}}

Đầu ra:

Ngoại lệ trong luồng “main” java.util.ConcurrentModificationException

tại java.util.HashMap $ HashIterator.nextEntry (Nguồn không xác định)

chuyển đổi từ double sang int java

Bây giờ chúng ta hãy tiếp tục và xem qua Trình lặp an toàn thất bại,

Trình lặp lại an toàn không thành công

Không giống như các trình vòng lặp Fail Fast, các trình vòng lặp Fail Safe không đưa ra bất kỳ ngoại lệ nào nếu bộ sưu tập được sửa đổi trong quá trình lặp lại. Điều này là do họ lặp lại trên bản sao của bộ sưu tập, thay vì bộ sưu tập thực tế. Các sửa đổi cấu trúc được thực hiện trên bộ sưu tập thực tế không được họ chú ý.

Tuy nhiên, cần lưu ý rằng không có cái gọi là Trình lặp an toàn thất bại thực sự. Sẽ thích hợp nếu gọi nó là Yếu-Nhất quán. Điều này đơn giản có nghĩa là nếu Một Bộ sưu tập được sửa đổi trong quá trình lặp lại, những gì Người lặp lại thấy được đảm bảo yếu. Hành vi này khác nhau đối với các bộ sưu tập khác nhau và được ghi lại trong Javadocs.

Ví dụ về Trình lặp an toàn không thành công:

public class FailSafeExample {public static void main (String [] args) {ConcurrentMap monthIndex = new ConcurrentHashMap () monthIndex.put ('1', 'January') monthIndex.put ('2', 'March') monthIndex.put ( '3', 'March') iterator iterator = monthIndex.keySet (). Iterator () while (iterator.hasNext ()) {System.out.println (monthIndex.get (iterator.next ())) monthIndex.put ( '4', 'April')}}}

Đầu ra:

  • tháng Giêng
  • Tháng hai
  • tháng Ba

Cuối cùng trong bài viết này, chúng tôi sẽ so sánh các trình vòng lặp này,

Sự khác biệt: Trình lặp lại an toàn nhanh và không thành công

Dưới đây là những khác biệt cơ bản giữa hai trình vòng lặp:

Thông số Bộ lặp nhanh không thành công Trình lặp lại an toàn không thành công
Throw ConcurrentModification Exception

Có, họ ném CocurrentModificationExcepti-on nếu một bộ sưu tập được sửa đổi trong khi lặp lại nó.

Không, họ không đưa ra bất kỳ ngoại lệ nào nếu một bộ sưu tập được sửa đổi trong khi lặp lại nó.

Sao chép bộ sưu tập

Không, họ sử dụng bộ sưu tập gốc để duyệt qua các phần tử.

Có, họ sử dụng bản sao của bộ sưu tập gốc để duyệt qua.

Chi phí bộ nhớ

Không, chúng không yêu cầu thêm bộ nhớ.

Có, chúng yêu cầu thêm bộ nhớ để sao chép bộ sưu tập.

Ví dụ

HashMap, Vector, ArrayList, HashSet

CopyOnWriteArrayList

Các trình lặp này vừa độc đáo vừa rất cần thiết trong ngôn ngữ đa năng của java. Mặc dù không an toàn có một vòng an ủi cho nó, nhưng trình lặp nhanh thất bại chứng tỏ là mạnh mẽ.

Điều này dẫn đến phần cuối của bài viết này. trong trường hợp bạn muốn tìm hiểu thêm, hãy xem của Edureka. Khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế để giúp bạn bắt đầu bước đầu vào lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến vấn đề này trong phần nhận xét của blog “Fail Fast vs Fail Safe” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.