Walk me through the internal working of ConcurrentHashMap in Java 8. How does it achieve thread safety without locking the entire map?