나는 clojure
을 처음 사용하고 있으며, 예 : bank account transfer
이라는 고전적인 동시성 사례를 구현하려고합니다. transactional memory
을 사용하여 구현하고 싶습니다. 여기 clojure 은행 계좌 송금 사례
java
static class Account {
private double balance;
public synchronized void withdraw(double value) {
balance -= value;
}
public synchronized void deposit(double value) {
balance += value;
}
}
static synchronized void transfer(Account from, Account to, double amount) {
from.withdraw(amount);
to.deposit(amount);
}
확실하지의 예이지만 유효한 것 같다.
그리고 여기가 clojure
(deftype Account [balance])
(def account1 (Account. (ref 100)))
(def account2 (Account. (ref 100)))
(defn print-accs []
(println " account 1 => " (deref (.balance account1))
" account 2 => " (deref (.balance account2))))
(defn transfer [from to amount]
(dosync
(alter (.balance from) - amount)
(alter (.balance to) + amount)))
(print-accs) ; 100 100
(transfer account1 account2 10)
(print-accs) ; 90 110
내 코드는 transactional memory
또는 모든 bank account transfer
의 올바른 구현을 사용의 적절한 예이다? 나는 ref
는 필드에 올바른 사용 했 또는 전체 Account
예를 들어 그것을 사용해야?
오타? 당신은'에서'로 넘어가지만 나중에'account [12]' – cfrick
오 실제로 사용하십시오. Fixed – lapots