How Can Multiple Threads Modify the Same Data Without Locks? The Science of Lock-Free Programming and the ABA Problem