Tôi đang làm việc trên một cái gì đó sử dụng ByteBuffers được tạo từ các tệp được ánh xạ trên bộ nhớ (qua FileChannel.map()) cũng như ByteBuffers trực tiếp trong bộ nhớ. Tôi đang cố gắng hiểu các ràng buộc mô hình đồng thời và bộ nhớ.Có thể xem nhiều chuỗi ghi trên một ByteBuffer được ánh xạ trực tiếp trong Java không?
Tôi đã đọc tất cả Javadoc (và nguồn) có liên quan cho những thứ như FileChannel, ByteBuffer, MappedByteBuffer, v.v. Có vẻ rõ ràng rằng một ByteBuffer cụ thể (và các lớp con có liên quan) có một loạt các trường và trạng thái không được bảo vệ từ quan điểm của mô hình bộ nhớ. Vì vậy, bạn phải đồng bộ hóa khi sửa đổi trạng thái của một ByteBuffer cụ thể nếu bộ đệm đó được sử dụng trên các luồng. thủ đoạn thường gặp bao gồm sử dụng một ThreadLocal để quấn ByteBuffer, lặp lại (trong khi đồng bộ) để có được một trường hợp mới trỏ đến các byte ánh xạ cùng vv
Với kịch bản này:
- quản lý có một bộ đệm byte ánh xạ
B_all
cho toàn bộ tệp (giả sử là < 2gb) - các cuộc gọi của người quản lý trùng lặp(), position(), limit() và slice() trên B_all để tạo một ByteBuffer nhỏ hơn
B_1
. cho chủ đề T1 - người quản lý thực hiện tất cả các công cụ tương tự để tạo ByteBuffer
B_2
trỏ đến các byte ánh xạ tương tự và đưa ra này cho chủ đề T2
Câu hỏi của tôi là: Có thể T1 ghi vào B_1 và T2 ghi vào B_2 đồng thời và được đảm bảo để xem những thay đổi của nhau? T3 có thể sử dụng B_all để đọc các byte đó và được đảm bảo để xem các thay đổi từ cả T1 và T2?
Tôi biết rằng việc ghi trong một tệp được ánh xạ không nhất thiết được thấy trên quy trình trừ khi bạn sử dụng force() để hướng dẫn hệ điều hành viết các trang xuống đĩa. Tôi không quan tâm về điều đó. Giả sử cho câu hỏi này là JVM này là quá trình duy nhất viết một tệp ánh xạ duy nhất.
Lưu ý: Tôi không tìm kiếm các dự đoán (tôi có thể tự mình làm tốt). Tôi muốn tham chiếu đến một cái gì đó dứt khoát về những gì là (hoặc không) được đảm bảo cho bộ nhớ đệm ánh xạ trực tiếp. Hoặc nếu bạn có kinh nghiệm thực tế hoặc các trường hợp thử nghiệm âm tính, điều đó cũng có thể phục vụ như là bằng chứng đầy đủ.
Cập nhật: Tôi đã thực hiện một số thử nghiệm có nhiều chuỗi ghi vào cùng một tệp song song và cho đến nay có vẻ như những ghi đó ngay lập tức hiển thị với các chuỗi khác. Tôi không chắc liệu tôi có thể dựa vào điều đó không.
Tôi đọc api cho MappedByteBuffer (Java 7) và họ cảnh báo rằng nó chỉ nên được sử dụng để đọc/ghi, chứ không phải thao tác. – toto2
Có, câu hỏi của tôi là về hai chủ đề viết. Tôi không hiểu ý bạn là "thao tác". –
JavaDoc của MappedByteBuffer: "Tất cả hoặc một phần của bộ đệm byte được ánh xạ có thể trở thành không thể truy cập bất kỳ lúc nào, ví dụ: nếu tệp được ánh xạ bị cắt bớt. Do đó, các trường hợp ngoại lệ không được chỉ định sẽ được đưa ra tại thời điểm truy cập hoặc vào một thời điểm nào đó sau đó, nên thực hiện các biện pháp phòng ngừa thích hợp để tránh ** thao tác ** của tệp được ánh xạ bởi chương trình này hoặc đồng thời chạy chương trình, ngoại trừ việc đọc hoặc ghi nội dung của tệp. " – toto2