How about Rust's “share by transferring ownership”?
(0) In the general case, whatever object you give to a third party, you don't own anymore. And the type checker enforces this.
(1) Unless the object's type supports shallow copying, in which case, you get to keep a usable copy after the move.
(2) If the object's type doesn't support shallow copying, but supports deep cloning, you can also keep a copy [well, clone], but only if you explicitly request it.
This ensures that communication is always safe, and never more expensive than it needs to be.
---
Sorry, I can't post a proper reply because I'm “submitting too fast”, so I'll reply here...
The solution consists of multiple steps:
(0) Wrap the resource in a RWLock [read-write lock: http://doc.rust-lang.org/std/sync/struct.RwLock.html], which can be either locked by multiple readers or by a single writer.
(1) The RWLock itself can't be cloned, so wrap it in an Arc [atomically reference-counted pointer: http://doc.rust-lang.org/std/sync/struct.Arc.html], which can be cloned.
(2) Clone and send to as many parties as you wish.
---
I still can't post a proper reply, so...
Rust's ownership and borrowing system is precisely what makes RWLock and Arc work correctly.