Mahamudul Hasan Rubel
HomeBlogCoursesAboutProjectsSkillsExperiencePhotosContact
Mahamudul Hasan Rubel

Senior Software Engineer crafting high-performance web applications and SaaS platforms.

Navigation

  • Home
  • Blog
  • Courses
  • About
  • Projects
  • Skills
  • Experience
  • Photos
  • Contact

Get in Touch

Available for senior/lead roles and consulting.

bd.mhrubel@gmail.comHire Me

Subscribe to the newsletter

Get new articles and course lessons delivered to your inbox. No spam, unsubscribe anytime.

© 2026 Mahamudul Hasan Rubel. All rights reserved.

Built with using Next.js 16 & Tailwind v4

Back to Blog
Lesson 10 of the Advanced React: Performance, Architecture & Patterns course
ReactJune 27, 20264 min read

Introduction to Concurrent React: Time-Slicing and Performance

Learn how Concurrent React uses time-slicing to keep UI responsiveness high. Discover how to move from synchronous to interruptible rendering in your apps.

ReactPerformanceConcurrent ReactTime SlicingRenderingjavascriptfrontend

Previously in this course, we explored the Deep Dive into the Reconciliation Algorithm, where we established that React’s work is split into Render and Commit phases. While that foundation explains how React updates the DOM, it assumes a synchronous execution model—until now.

In this lesson, we move beyond synchronous execution to Concurrent React. We will look at how React uses Time Slicing to break up long-running rendering tasks, ensuring your application remains interactive even when performing heavy computations.

The Problem: Synchronous Blocking

In legacy React, once the render phase began, it was "all or nothing." React would walk the entire Fiber tree, calculate updates, and prepare the DOM. If your tree was deep or your state updates triggered heavy recalculations, the main thread was effectively blocked.

During this time, the browser couldn't paint updates, handle user input, or respond to hover effects. This is the "jank" you often feel in complex dashboards. Even if you optimized with useMemo or useCallback—as we covered in Mastering useCallback and useMemo—there is a limit to how much work you can squeeze into a single 16ms frame.

What is Concurrent Rendering?

Concurrent React changes the paradigm: it makes rendering interruptible.

Instead of treating a render as a single, indivisible block of work, React views it as a series of small, discrete tasks. This allows React to periodically pause its work, check if there is an urgent user interaction (like a button click or text input), and yield control back to the browser.

The Concept of Time-Slicing

Time-slicing is the mechanism that enables this concurrency. React processes the component tree in small chunks of time (often a few milliseconds).

FeatureSynchronous RenderingConcurrent Rendering
ExecutionAtomic, blockingInterruptible, non-blocking
PriorityFirst-come, first-servedUrgent vs. Background tasks
User ExperienceRisk of UI freezingSmooth, responsive interaction

If a user starts typing while React is in the middle of a massive list re-render, Concurrent React can pause the list rendering, process the keystroke immediately, and then resume the list rendering once the browser is idle.

Worked Example: The "Heavy" List

Imagine a dashboard where you have a list of 5,000 items. A standard filter operation causes a noticeable freeze because the browser cannot process input until the filter logic finishes.

JSX
// Conceptual: Synchronous (Legacy)
const [filter, setFilter] = useState("");

const handleChange = (e) => {
  setFilter(e.target.value); // This triggers a synchronous render of all 5,000 items
};

// With Concurrent React, we prepare for non-blocking UI
// We will use hooks like useTransition in the next lesson to 
// explicitly tell React: "this update is lower priority."

In the current architecture of our course project, we've focused heavily on State Colocation Strategies. Now, we add a new layer: intent. Concurrent React allows us to mark updates as "urgent" (like typing) or "transitions" (like filtering a list).

Hands-on Exercise

To prepare for our next deep dive into useTransition, I want you to observe the blocking behavior in your current project:

  1. Locate a component in your project that performs a heavy map or filter operation.
  2. Add a console.count('Render') inside the child components being rendered.
  3. Type into an input field that triggers this update.
  4. Open the Performance tab in Chrome DevTools and look for the "Long Task" warnings during your typing.
  5. Notice how the input value lags behind your keystrokes because the main thread is blocked by the reconciliation of those items.

Common Pitfalls

  • Assuming Concurrency is Magic: Concurrent React is not a "free" performance boost. It requires you to structure your state and components correctly. If your components are doing expensive operations during render (like JSON.parse on a massive object), you still need to optimize those.
  • Breaking Pure Render Rules: Because React can now render your component multiple times and potentially discard a "work in progress" render, it is more important than ever that your render functions remain pure. Never initiate side effects or mutate global state inside the render body.
  • Over-using Concurrency: Not every state update needs to be concurrent. Use it for heavy transitions, not for simple toggles like opening a modal or changing a checkbox.

Recap

Concurrent React transforms the rendering process from a single block of work into an interruptible flow. By leveraging time-slicing, React ensures that your UI remains responsive to user input, even when background rendering tasks are complex. We’ve moved from "everything happens at once" to a model where React understands which tasks are urgent and which can be deferred.

Up next, we will implement Non-blocking UI with useTransition, where we will apply these concepts to actually decouple your heavy filtering logic from your urgent input handling.

Previous lessonEliminating Prop DrillingNext lesson Non-blocking UI with useTransition
Back to Blog

Similar Posts

ReactJune 27, 20263 min read

Handling Deferred Data with useDeferredValue in React

Master useDeferredValue to keep your React app responsive during heavy renders. Learn to prioritize user input over expensive data-driven UI updates.

Read more
ReactJune 28, 20264 min read

Monitoring Production Performance: A Senior Engineer's Guide

Stop guessing why your app feels slow. Learn to integrate monitoring, set actionable performance alerts, and analyze real-world trends in production.

Part of the course

Advanced React: Performance, Architecture & Patterns

advanced · Lesson 10 of 47

  1. 1

    Deep Dive into the Reconciliation Algorithm

    4 min
  2. 2

    Profiling with React DevTools

    3 min
  3. 3

    Establishing Performance Budgets

    3 min
Read more
ReactJune 28, 20264 min read

Route-level Code Splitting: Shrinking Bundles in React

Master Code Splitting in React using dynamic imports and Suspense. Learn how to architect your app for faster initial loads and smaller bundle sizes.

Read more
  • 4

    Strategic use of React.memo

    3 min
  • 5

    Mastering useCallback and useMemo

    4 min
  • 6

    State Colocation Strategies

    4 min
  • 7

    Optimizing Context Providers

    4 min
  • 8

    Advanced Context Composition

    4 min
  • 9

    Eliminating Prop Drilling

    4 min
  • 10

    Introduction to Concurrent React

    4 min
  • 11

    Non-blocking UI with useTransition

    4 min
  • 12

    Handling Deferred Data with useDeferredValue

    3 min
  • 13

    Mastering Suspense for Data Fetching

    4 min
  • 14

    Streaming Server-Side Rendering

    3 min
  • 15

    Designing Compound Components

    3 min
  • 16

    The Render Props Pattern

    4 min
  • 17

    Implementing Control Props

    4 min
  • 18

    Headless UI Architectures

    3 min
  • 19

    Modular Directory Structures

    3 min
  • 20

    Refactoring Monolithic Components

    3 min
  • 21

    Optimistic UI Updates

    3 min
  • 22

    Advanced Cache Invalidation

    4 min
  • 23

    Handling Race Conditions

    4 min
  • 24

    Server-Client State Synchronization

    3 min
  • 25

    Route-level Code Splitting

    4 min
  • 26

    Offloading Tasks with Web Workers

    3 min
  • 27

    Advanced Error Boundaries

    3 min
  • 28

    Monitoring Production Performance

    4 min
  • 29

    Final Project Audit & Optimization

    Coming soon
  • 30

    Advanced Hook Patterns

    Coming soon
  • 31

    Managing Global State with Zustand/Redux

    Coming soon
  • 32

    Testing Performance-Critical Components

    Coming soon
  • 33

    Static Site Generation (SSG) Patterns

    Coming soon
  • 34

    Internationalization (i18n) Architecture

    Coming soon
  • 35

    Accessibility (a11y) in Advanced Components

    Coming soon
  • 36

    Managing Third-Party Integrations

    Coming soon
  • 37

    Advanced Form Handling

    Coming soon
  • 38

    Using Portals for UI Overlays

    Coming soon
  • 39

    Implementing Virtualized Lists

    Coming soon
  • 40

    Building Design System Primitives

    Coming soon
  • 41

    Managing Large-Scale Data Fetching

    Coming soon
  • 42

    Micro-Frontends with React

    Coming soon
  • 43

    Security Best Practices in React

    Coming soon
  • 44

    Advanced Ref Usage

    Coming soon
  • 45

    Memoization Pitfalls

    Coming soon
  • 46

    Mastering React Patterns for Scalability

    Coming soon
  • 47

    Advanced TypeScript with React

    Coming soon
  • View full course