This chapter presents abstractions of shared memory. They represent distributed programming abstractions, which are shared among processes and encapsulate data storage functionality accessible by read and write operations. The memory abstractions are called registers because they resemble those provided by multiprocessor machines at the hardware level, though in many cases, including in this chapter, they are implemented over processes that communicate by exchanging messages over a network and do not share any physical storage device. A register abstraction also resembles a disk device accessed over a storage-area network, a file in a distributed file system, or a shared working space in a collaborative editing environment. Therefore, understanding how to implement register abstractions helps us understand how to implement such distributed storage systems.