Concurrent rendering lets React prepare a new tree in small interruptible chunks, so urgent updates like typing can cut in front of slow ones, and half-finished work can be thrown away without the user ever seeing it.
Before React 18, every state update produced one synchronous render: React called your components from the root down and did not return control to the browser until the whole tree was built and committed. A slow render of a large list meant dropped frames, and a keystroke that arrived during it waited until the render finished. Concurrent rendering changes the shape of that work without changing what your components look like.
The core idea is priority. Every update is stamped with a lane, one bit in a 31-bit mask defined in ReactFiberLane. A state update inside a click or keypress gets SyncLane. An update wrapped in startTransition, or the catch-up render scheduled by useDeferredValue, gets a TransitionLane. When React decides what to render next it picks the highest priority pending lane, and it renders only the updates that belong to that lane, leaving lower priority updates queued for a later pass.
Transition lanes are rendered by workLoopConcurrent, which processes one fiber at a time and asks the Scheduler package whether it should yield. The Scheduler answers yes roughly every 5 ms. React then exits the loop and posts a MessageChannel message to resume, which gives the browser a chance to paint and dispatch events. If a higher priority update arrives during one of those gaps, React abandons the work-in-progress tree and starts again with the new state.
Throwing work away is safe because the render phase is pure: it only builds fibers in memory and never touches the DOM or runs effects. The commit phase, which does touch the DOM, is still synchronous and cannot be interrupted, so the screen never shows a partially applied update. Concurrent behaviour is opted into per update through startTransition, useTransition, and useDeferredValue. Plain setState calls in event handlers are still rendered synchronously, exactly as before.
Interview framing: define Concurrent Rendering in one sentence, then explain one concrete runtime behavior and one common pitfall with a short code example.