How does AtomicInteger implement atomic updates (e.g., via CAS using Unsafe or VarHandles)? What is the ABA problem in lock-free algorithms, how can it affect CAS-based structures, and what are common mitigations (such as version tagging, AtomicStampedReference, or hazard pointers)?