2013-03-31 23 views
5

Tôi đang đọc qua mã java để đảm bảo đó là chuỗi an toàn.Làm cách nào để phân tích mã nguồn Java và đảm bảo nó là Chủ đề an toàn

Như tôi đã biết, bất kỳ biến cục bộ nào trong phương thức đều là an toàn chỉ vì nó thuộc về địa chỉ bộ nhớ ngăn xếp. Bất kỳ biến lớp/cá thể nào không phải là luồng an toàn vì nó thuộc về bộ nhớ heap được chia sẻ bởi luồng khác.

Theo quy tắc chung, tôi có thể đặt từ khóa đồng bộ trên mọi phương pháp chạm vào biến lớp.

Có plugin eclipse hay quy tắc nào tôi có thể phân tích/ngăn chặn các vấn đề đa luồng không?

+1

Có. FindBugs có thể thực hiện phân tích như vậy. Xem: http://stackoverflow.com/questions/2423266/thread-safety-framework – noahlz

+0

Vâng, một cá thể đối tượng được tạo ra bởi một luồng và được tham chiếu chỉ bởi luồng đó, (ví dụ, tham chiếu của nó là một biến cục bộ), không phải là bản chất được chia sẻ với bất kỳ chủ đề nào khác. –

+0

"quy tắc/điểm" chung khác mà tôi nên lưu ý là gì? – youcanlearnanything

Trả lời

5

Thế giới luồng là một trong những điều nhạy cảm nhất đối với một lập trình viên giỏi. Mọi giải pháp cho các vấn đề về luồng đều đòi hỏi kiến ​​thức lớn về ngữ cảnh. Bất kỳ plugin nào sẽ không đủ "thông minh" để chọn giải pháp phù hợp nhất mọi lúc.

Thật vậy, synchronized đại diện cho khoảng 5% của mọi giải pháp có thể. Hãy nghĩ đến các bộ sưu tập đồng thời, ví dụ: ConcurrentHashMap được suy nghĩ rất tốt và không sử dụng khóa cơ bản lớn trên nó => phức tạp hơn nhiều so với việc đó.

Hãy suy nghĩ đến volatile, để thực hiện đảm bảo bộ nhớ rào cản trong khi tránh bất kỳ loại nguyên tử nào thông qua bất kỳ khóa nào; atomicity không phải là vai trò của nó, nhưng trong một số trường hợp, điều này sẽ là tuyệt vời để tránh nó để cải thiện hiệu suất.

Vì vậy, hãy quên đi bất kỳ plugin (ngay cả khi một số có thể tồn tại) cho thread-an toàn nhưng tin tưởng bộ não của bạn;)

Lưu ý: Đưa synchronized từ khóa trên mỗi lớp văn bản, sẽ là ........ .ugly mà không nói về hiệu suất kém ...

0

Tôi không nghĩ nhật thực sẽ cung cấp bất kỳ plugin nào như vậy. Cùng với các biến cục bộ cố gắng sử dụng các đối tượng không thể thay đổi, ThreadLocals và hầu hết các vấn đề đa luồng od sẽ được xử lý.

0

Tôi không thấy công cụ biên dịch thời gian có thể phát hiện deadlocks. Đó sẽ là khó khăn để mô hình. Tất cả những gì tôi biết là some people have tried.

Bạn luôn có thể phát hiện chúng khi chạy. JMX Đậu có thể được truy vấn để hiển thị các chủ đề bế tắc như được giải thích trong câu trả lời này - Deadlock detection in Java.

1

Tôi không nghĩ rằng có bất cứ điều gì chắc chắn sẽ kiểm tra an toàn luồng, có một số công cụ đã được đề cập, như findbugs sẽ thực hiện công việc hợp lý tìm ra những sai lầm rõ ràng. Nó là rất nhiều lập trình để đảm bảo rằng chương trình của họ không bị rò rỉ biến hoặc tham chiếu vào các chủ đề khác nhau và nơi mọi thứ được sử dụng trong nhiều chủ đề đảm bảo rằng mỗi thread thấy giá trị 'chính xác'.

Thiết kế an toàn trước khi thực hiện, bạn có thể thấy rằng nó hoạt động tốt cho nhu cầu của bạn nhưng nếu bạn đặt tối ưu hóa trong việc tăng độ phức tạp và có khả năng thất bại, nó có thể không phải là nút cổ chai.

Tôi khuyên bạn nên đọc đọc cụ thể Java Concurrency In Practice, bạn cũng có thể tìm thấy Effective Java cũng hữu ích.

0

Thêm nhận xét nhưng hơi dài quá.

Theo quy tắc chung, tôi có thể đặt từ khóa đồng bộ trên mọi phương pháp chạm vào biến lớp.

Không thực sự - Hãy suy nghĩ ví dụ về lớp Vector: nó được đồng bộ hóa tuy nhiên lặp lại yêu cầu khóa bên ngoài. Một alernative đồng thời là CopyOnWriteArrayList, ví dụ, cho phép lặp mà không cần khóa toàn bộ bộ sưu tập.

Dòng dưới cùng đã được trả lời bởi người khác: nó không đơn giản như việc thêm synchronized ở mọi nơi. Bạn cần phải phân tích chính xác hợp đồng của lớp và đảm bảo rằng hợp đồng vẫn được hoàn thành trong một tình huống đa luồng.

1

ThreadSafe (http://www.contemplateltd.com/threadsafe, bản dùng thử miễn phí có sẵn) thực hiện chính xác những gì câu hỏi yêu cầu. Xem này InfoQ article cho các ví dụ về các lỗi đồng thời mà nó tìm thấy trong các ứng dụng nguồn mở bao gồm Apache JMeter và K9Mail. Xem Ivan Senic's blog để biết ý kiến ​​của người dùng. ThreadSafe's Wikipedia entry cung cấp một bản tóm tắt ngắn gọn.

(Tiết lộ: ThreadSafe là một công cụ thương mại và tôi là người đồng sáng lập Contemplate, công ty sản xuất nó.)

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