This document discusses concurrent programming in Java and introduces the Jcc programming model as an alternative. Jcc replaces threads with vats that execute single-threadedly. Communication between vats uses ports to pass immutable objects. Within a vat, promises (=typed logical variables) and watchers allow constraints-based concurrency similar to timed default concurrent constraint programming. The document uses a bank account application example to illustrate vats, ports, promises, and watchers in Jcc.
2. Concurrent programming in Java
Threads, shared heap, separate stack
Synchronization based on locking
mutable objects in shared heap
Rules to govern information flow between
thread-specific data structures (heap
cache, stack) and shared store.
3. Concurrent programming in Java
`` Unfortunately the current specification
has been found to be hard to understand
and has subtle, often unintended,
implications….. Several important issues
[….] simply aren't discussed in the existing
specification.''
4. Concurrent programming in Java
Concurrent execution in Java is the
default.
Every line of Java code could be executed
in parallel by multiple threads on the same
object.
6. Jcc Design Goals
• Interoperability with Java: source code,
JVM, and type system
• API for the programmer to add new
constraint systems
• Support for reflective meta-programming
• The implementation should be usable for
medium-sized programs.
7. Rest of the talk
An example Bank application
The design elements of Jcc.
9. The Bank application: Withdrawals
Withdrawals succeed if balance is large
enough.
If not, repeat withdrawal after each of the
next n deposits. If balance still not large
enough, it is rejected.
15. Communication: Ports
Each port is located at a vat and is “read”
only by code at that vat
Each port can have multiple writers/tellers
at other vats
Objects written into ports are deep-copied
from source to target vat
16. Vats and ports in the bank
application
Ravi
Withdrawal
Account1
(zero)
Account2
Deposit(100) suspend
suspend
17. Execution in a Vat
Process 1 message at a time to completion
before getting another message:
create new local heap objects
invoke methods on objects in heap
send objects to ports in another vat
All these operations do not block!
Bounded response guarantees?
18. Logical time
A logical time-step:
receive input
compute response
Correspondence to physical time if bounded
response can be guaranteed cf. Esterel.
19. Logical time in the bank application
Withdrawal
Account1
(zero)
Time steps:
0. Withdrawal(100)
1. Deposit(25)
2. Deposit(25)
3. Deposit(25)
4. Deposit(25)
20. Time based control constructs
1) next {S}. S is stored and executed in the
next time instant.
2) always {S}: Run S at EVERY time instant
Oops! Many programs can be executing at
the same time instant
21. Mutiple programs in the Account1
vat of the bank application
Withdrawal
Account1
(zero)
Time steps:
0. Withdrawal(100): “withdrawal code”
1. Deposit(25): “withdrawal, deposit code”
2. Deposit(25): “withdrawal, deposit code”
3. Deposit(25): as above
4. Deposit(25): as above
23. Constraint stores in Jcc
Each vat has its own store
All items in a store are dropped at the end
of a time instant: programmer carries
items into following time instant explicitly
using next.
Constraints via promises (= typed logical
variables) in Jcc.
24. Promises
Promise in Jcc = java.lang.Object in Java
1. Unrealized and unwatched. [new variables]
2. Realized [new constants]
3. Bound [o.equate(p) ]
4. Unrealized and watched
25. Watchers for promises
When (p) do S
If p is realized, run S.
Otherwise, suspend S on p. S is a
watcher for p
Effect of p.equate(q)??
27. Code for Account
public BankAccount() {
every (balanceUpdate) {
// check if pending withdrawals
// can be satisfied
}
28. Code for Account
public Confirmation deposit(Integer amount){
Confirmation result = new Confirmation();
when (amount) {
// update balance
result.equate(“Success”);
}
return result;
}
29. Code for Account
public Confirmation withdraw(Integer amount){
Confirmation result = new Confirmation();
when (amount) {
// check balance
// if balance sufficient
result.equate(“Success”);
//if balance not sufficient, add to pending list
}
return result;
}