2010-10-23 30 views
6

Tôi đang viết ứng dụng đồng thời cao, điều này đang sửa đổi rộng rãi các đối tượng của MyClass. Lớp này bao gồm một số trường. Câu hỏi của tôi là làm thế nào để ngăn chặn sửa đổi của đối tượng cụ thể trong quá trình serialization của nó bởi một thread?serialization đối tượng java - thread an toàn?

Kính trọng, Matt

Trả lời

7

By synchronizing cả các phương pháp mà serialize và sửa đổi tình trạng đối tượng.

+3

bao gồm sửa đổi trạng thái của bất kỳ đối tượng phụ nào (chứa trong các trường của đối tượng). – Thilo

+3

Trong khi đồng bộ hóa giải quyết mối quan tâm của bạn an toàn thread, nó làm như vậy bằng cách serializing tất cả truy cập, do đó ứng dụng của bạn về cơ bản là đơn luồng và không đồng thời ở tất cả. –

4

Tại sao phải sửa đổi MyClass? Một cách tiếp cận tốt hơn (và dễ dàng hơn nhiều để đối phó với đồng thời) là tạo ra các phiên bản bất biến mới của đối tượng trạng thái của bạn và CAS chúng với một AtomicReference khi cập nhật. Ví dụ:

final class MyClass { 
    final int age; 
    final String name; 
    final String address; 

    MyClass(int age, String name, String address) {…} 

    MyClass setNameAndAddress(String name, String address) {return new MyClass(age, name, address);} 
} 

Sau đó, việc tuần tự hóa không phải là vấn đề khi bạn đang xử lý đối tượng không thay đổi. Tham chiếu được lưu trữ của bạn chỉ có thể thay đổi từ trạng thái hợp lệ này sang trạng thái hợp lệ khác và nhiều bản cập nhật có thể được thực hiện một cách nguyên tử.

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