Basically in Pony you can describe memory as:
1. Single Ownership, Immutable
2. Single Ownership, Mutable
3. Shared Ownership, Immutable
4. Shared Ownership, Mutable
If you're moving (1) or (2) that's basically free.
If you're sharing (3) you just need an atomic reference count.
If you're sharing (4) you need an atomic reference count and some sort of synchronizing primitive, such as a mutex (or maybe the runtime can understand how to schedule things such that they don't race, don't know).
In Pony these reference capabilities all have names that I don't remember and there are also ways to "recover" a capability, basically translating one into another, which was one of the more complex features for me to get my head around.
That's basically how I recall it working, although the reference counting implementation is very interesting and they wrote a paper about it (Orca).