2012-05-10 14 views
7

FileLock trong java có an toàn trên nhiều luồng trong cùng một quy trình hoặc giữa các quy trình khác nhau hay cả hai?FileLock trong java có an toàn trên nhiều luồng trong cùng một quy trình hoặc giữa các quy trình khác nhau hay cả hai?

Các javadoc nói: ổ khóa

tập tin được tổ chức đại diện cho toàn bộ máy ảo Java. Chúng không thích hợp để kiểm soát quyền truy cập vào một tệp bằng nhiều luồng trong cùng một máy ảo.

Đối tượng khóa tệp an toàn để sử dụng cho nhiều chuỗi đồng thời.

mà tôi không thực sự nhận được: có nghĩa là FileLock an toàn trên nhiều luồng trong cùng một quy trình, giữa nhiều quy trình khác nhau hoặc cả hai?

+0

Phần nào của 'không phù hợp để kiểm soát quyền truy cập vào tệp bởi nhiều luồng trong cùng một máy ảo' mà bạn không nhận được? Nó hoàn toàn rõ ràng. – EJP

Trả lời

2

Nó nói rằng các đối tượng là an toàn thread khi bạn xem chúng như là các đối tượng Java đơn giản, nhưng chúng sẽ không ngăn các luồng khác mở cùng một tệp. Tức là, họ không an toàn khi bạn nhìn vào dịch vụ họ cung cấp.

+0

Vì vậy, nói cách khác, nó là an toàn để đồng bộ hóa các tập tin giữa các quá trình nhưng không cho đồng bộ hóa các tập tin giữa các chủ đề của quá trình tương tự? – shawn

+1

Vâng, đó là những gì tài liệu nói. Nhưng có một bài đăng gần đây, nơi một chàng trai vẫn quản lý để sử dụng các khóa tệp bên trong Java. Anh ta không dựa vào chúng để ngăn chặn việc mở bằng các chủ đề khác, mà là khóa * tư vấn * - bạn có thể cố gắng lấy khóa tập tin một cách rõ ràng và xem bạn đã thành công chưa. Tuy nhiên, đây là một thực tế đáng ngờ, với các mối nguy hiểm đa nền tảng và việc sử dụng sai các khóa tệp cấp thấp rõ ràng. –

2

Tiếp tục xuống:

API tập tin khóa này được thiết kế để ánh xạ trực tiếp đến cơ sở khóa có nguồn gốc của hệ điều hành cơ bản. Vì vậy, các khóa được lưu trữ trên một tệp sẽ hiển thị cho tất cả các chương trình có quyền truy cập vào tệp, bất kể ngôn ngữ trong đó các chương trình đó là được viết.

Điều này cho thấy mục đích của nó là được sử dụng giữa các quy trình khác nhau.

dòng này:

Họ không thích hợp cho việc kiểm soát quyền truy cập vào một tập tin bằng nhiều chủ đề trong cùng một máy ảo.

khuyên bạn không nên sử dụng nếu bạn có một quy trình đơn lẻ với nhiều chuỗi. Trong trường hợp đó, bạn có thể sử dụng phần synchronized hoặc ReadWriteLock.