Nói, tôi có một đối tượng dữ liệu:Chủ đề hồ bơi, dữ liệu chia sẻ, Java Synchronization
class ValueRef { double value; }
đâu mỗi đối tượng dữ liệu được lưu trữ trong một bộ sưu tập tổng thể:
Collection<ValueRef> masterList = ...;
Tôi cũng có một tập hợp các công việc, trong đó mỗi công việc có một bộ sưu tập các đối tượng dữ liệu cục bộ (trong đó mỗi đối tượng dữ liệu cũng xuất hiện trong masterList
):
class Job implements Runnable {
Collection<ValueRef> neededValues = ...;
void run() {
double sum = 0;
for (ValueRef x: neededValues) sum += x;
System.out.println(sum);
}
}
Sử dụng hợp cụ thể:
for (ValueRef x: masterList) { x.value = Math.random(); }
dụng nhất một hàng đợi công việc với một số công việc.
Thức dậy một hồ bơi thread
Chờ cho đến khi mỗi công việc đã được đánh giá
Lưu ý: Trong quá trình đánh giá công việc, tất cả các giá trị đều không đổi. Tuy nhiên, các luồng đã có thể đánh giá các công việc trong quá khứ và giữ lại các giá trị được lưu trong bộ nhớ cache.
Câu hỏi: số tiền tối thiểu của đồng bộ hóa cần thiết để đảm bảo mỗi chuỗi thấy giá trị mới nhất là gì?
Tôi hiểu đồng bộ hóa từ màn hình/quan điểm khóa, tôi không hiểu đồng bộ hóa từ phối cảnh bộ nhớ cache (ví dụ: mô hình bộ nhớ khi nhập/thoát của khối được đồng bộ hóa). Với tôi, có vẻ như tôi cần phải đồng bộ hóa một lần trong chuỗi cập nhật các giá trị để cam kết các giá trị mới vào bộ nhớ chính và một lần cho mỗi chuỗi công nhân, để xóa bộ đệm để các giá trị mới được đọc. Nhưng tôi không chắc chắn cách tốt nhất để làm điều này.
Cách tiếp cận của tôi: tạo màn hình chung: static Object guard = new Object();
Sau đó, đồng bộ hóa trên guard
, trong khi cập nhật danh sách chính. Sau đó, cuối cùng, trước khi bắt đầu hồ bơi thread, một lần cho mỗi luồng trong hồ bơi, đồng bộ hóa trên guard
trong một khối trống.
Điều đó thực sự gây ra sự tuôn ra đầy đủ của bất kỳ giá trị nào được đọc bởi chuỗi đó? Hoặc chỉ các giá trị được chạm vào bên trong khối đồng bộ hóa? Trong trường hợp đó, thay vì một khối trống, có lẽ tôi nên đọc từng giá trị một lần trong một vòng lặp?
Cảm ơn thời gian của bạn.
Chỉnh sửa: Tôi nghĩ câu hỏi của tôi sẽ bị hỏng khi tôi thoát khỏi khối đồng bộ, mỗi lần đọc đầu tiên (sau thời điểm đó) có chuyển sang bộ nhớ chính không? Bất kể những gì tôi đồng bộ hóa?
Dường như gần như là một nơi hoàn hảo để tận dụng từ khóa dễ bay hơi – ControlAltDel
Tôi đang viết một lần (có hiệu quả liên tục), nhưng có khả năng đọc hàng triệu lần. Dễ bay hơi không bao giờ được lưu trữ cục bộ. Nếu tôi tạo ra các hồ bơi thread mỗi lần, mã sẽ làm việc tốt w/o đồng bộ/dễ bay hơi (vì không có bộ nhớ cache trước sẽ tồn tại). –
Tôi không thấy nhu cầu dễ bay hơi ở đây. Nếu ValueRef có hiệu quả bất biến, chỉ cần làm cho nó thực sự bất biến. Sử dụng Double. Tạo một bộ sưu tập mới cho mỗi công việc trước khi nó được lên kế hoạch và bọc nó trong unmodifiableCollection (giống như một lời nhắc nhở). Bạn có vấn đề gì? –