Một cách tiếp cận sẽ là một chương trình copy-on-write, một cái gì đó như thế này:
public class Prices {
private volatile Map<String, Integer> prices = Collections.emptyMap();
public void putPrice(String ticker, int price) {
HashMap<String, Integer> newPrices = new HashMap<String, Integer>(prices);
newPrices.put(ticker, price);
prices = newPrices;
}
public Integer getPrice(String ticker) {
return prices.get(ticker);
}
}
này có chi phí tối thiểu cho được - một đọc từ một ổn định, và sau đó một tra cứu băm bình thường. Tuy nhiên, nó có một chi phí đáng kể cho đặt - việc tạo ra một bản đồ hoàn toàn mới, cộng với một ghi vào một biến động. Nếu tỷ lệ đọc của bạn để viết cao, điều này vẫn có thể là một sự cân bằng tốt.
Bạn có thể cải thiện điều này bằng cách chỉ tắt bản đồ khi bạn thực sự cần thêm mục nhập mới, thay vì cập nhật mục nhập hiện có; bạn có thể đạt được điều đó bằng cách sử dụng các giá trị có thể thay đổi:
public class Prices {
private volatile Map<String, AtomicInteger> prices = Collections.emptyMap();
public void putPrice(String ticker, int price) {
AtomicInteger priceHolder = prices.get(ticker);
if (priceHolder != null) {
priceHolder.set(price);
}
else {
HashMap<String, AtomicInteger> newPrices = new HashMap<String, AtomicInteger>(prices);
newPrices.put(ticker, new AtomicInteger(price));
prices = newPrices;
}
}
public Integer getPrice(String ticker) {
AtomicInteger priceHolder = prices.get(ticker);
if (priceHolder != null) return priceHolder.get();
else return null;
}
}
Tôi không chắc chắn những gì các đặc tính hiệu suất của một AtomicInteger
là; nó có thể là chậm hơn so với nó có vẻ. Giả sử AtomicInteger
không phải là bất hợp lý chậm, điều này sẽ khá nhanh - nó liên quan đến hai lần đọc từ một biến động cộng với một tra cứu băm bình thường cho mỗi get, và đọc từ một biến động, tra cứu băm và một ghi đơn để dễ bay hơi để cập nhật giá hiện tại. Nó vẫn liên quan đến việc sao chép bản đồ để bổ sung giá mới. Tuy nhiên, trong một thị trường điển hình, điều đó không xảy ra thường xuyên.
Nguồn
2012-11-08 22:42:56
sẽ sửa đổi hashmap (tức là sẽ có đặt và xóa) trong khi dữ liệu đánh dấu được cập nhật? hoặc các ánh xạ sẽ được thiết lập trước khi dữ liệu bắt đầu đến? – mxns
có sẽ có rất nhiều đặt nhưng không có loại bỏ. Về cơ bản trên mỗi tick đến, tôi sẽ làm một put (key, Price). Mặt khác, tôi cũng có thể prepopulate hashMap với một số đối tượng giả, vì tôi biết các phím trước khi tay. – trequartista
Chìa khóa là gì? Chứng khoán? –