Intuitively, I’ve always understood lock-free algorithms/data structures to be an approach to multithreaded programming that doesn’t involve using “locks”. Locks here mean any general mechanism used to “protect” memory so that multiple threads don’t, for instance, write to it at the same time. This typically involves one thread acquiring and owning the lock, while other threads have to wait for the owning thread to “free” the lock, allowing them to eventually access the data.