In many embedded real-time systems (i.e., systems subject to stringent timing constraints), system resources such as co-processors, I/O ports, buffers, etc. are inherently scarce and must be shared among multiple real-time tasks. Concurrent access to such serially-reusable resources must be carefully controlled, which is typically accomplished with locks. For instance, the well-known POSIX standard (implemented by VxWorks, QNX, and many other real-time operating systems) mandates the availability of the pthread_mutex_lock()/pthread_mutex_unlock() API for this purpose, and the AUTOSAR standard (deployed in millions of cars) similarly specifies GetSpinlock() and ReleaseSpinlock() to enable resources to be safely shared among processors. However, the use of locks invariably causes tasks to incur some blocking, which jeopardizes temporal correctness unless carefully managed: in a real-time system, resource access must always be granted after at most a bounded amount of blocking has been incurred, and an "optimal" real-time locking protocol should further "minimize" such blocking. In this talk, I will provide an overview of recent results concerning the fundamental limits of real-time locking on multiprocessors (i.e., what is "minimal" blocking), how to efficiently establish bounds on worst-case blocking without breaking a sweat, and the practical efficiency and applicability of real-time spinlock and semaphore protocols in multicore systems.