Bird
Raised Fist0
Node.jsframework~10 mins

SharedArrayBuffer for shared memory in Node.js - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - SharedArrayBuffer for shared memory
Create SharedArrayBuffer
Create TypedArray view on buffer
Pass buffer to worker threads
Workers read/write shared memory
Use Atomics for sync
Main thread and workers see updated data
This flow shows how a shared memory buffer is created, accessed by multiple threads, and synchronized using Atomics.
Execution Sample
Node.js
const sab = new SharedArrayBuffer(4);
const arr = new Int32Array(sab);
arr[0] = 42;
// Worker reads arr[0] and updates it
// Main thread sees updated value
Creates a shared buffer, writes a value, and allows worker threads to read and update it.
Execution Table
StepActionBuffer Content (arr[0])Notes
1Create SharedArrayBuffer of 4 bytesundefinedBuffer allocated, no data yet
2Create Int32Array view on bufferundefinedTypedArray view created, no data set
3Set arr[0] = 4242Main thread writes initial value
4Worker reads arr[0]42Worker sees initial value
5Worker updates arr[0] = 100 using Atomics.store100Worker writes new value atomically
6Main thread reads arr[0] using Atomics.load100Main thread sees updated value
💡 Execution stops after main thread reads updated shared value
Variable Tracker
VariableStartAfter Step 3After Step 5Final
sab (SharedArrayBuffer)Allocated (4 bytes)Allocated (4 bytes)Allocated (4 bytes)Allocated (4 bytes)
arr[0]undefined42100100
Key Moments - 3 Insights
Why do we need Atomics to update shared memory?
Without Atomics, simultaneous writes can cause race conditions. Atomics ensure updates are done safely and visible to all threads, as shown in steps 5 and 6.
Can we use normal arrays instead of SharedArrayBuffer for sharing data?
No, normal arrays are not shared between threads. SharedArrayBuffer creates memory accessible by multiple threads, as in step 1.
Why do we create a TypedArray view on the SharedArrayBuffer?
SharedArrayBuffer is raw memory. TypedArray like Int32Array interprets this memory as numbers, allowing us to read/write values, shown in step 2.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of arr[0] after step 3?
Aundefined
B100
C42
D0
💡 Hint
Check the 'Buffer Content (arr[0])' column at step 3 in the execution table.
At which step does the worker update the shared memory?
AStep 5
BStep 4
CStep 2
DStep 6
💡 Hint
Look for the step where 'Worker updates arr[0]' in the Action column.
If we skip using Atomics in step 5, what might happen?
AThe update is still safe and visible immediately
BRace conditions may occur causing inconsistent data
CThe buffer size will increase automatically
DThe main thread will crash
💡 Hint
Refer to the key moment about why Atomics are needed for safe updates.
Concept Snapshot
SharedArrayBuffer creates memory shared across threads.
Use TypedArray views (e.g., Int32Array) to read/write data.
Pass the buffer to workers to share data.
Use Atomics methods to safely read/write and synchronize.
Without Atomics, data races can cause errors.
Main and workers see the same memory updates.
Full Transcript
SharedArrayBuffer allows multiple threads in Node.js to share memory safely. First, a SharedArrayBuffer is created with a fixed size in bytes. Then, a TypedArray view like Int32Array is created on top of this buffer to read and write numbers. This buffer is passed to worker threads, which can read and update the shared memory. To avoid conflicts and ensure visibility, Atomics methods are used for reading and writing. This way, all threads see consistent data. The example code shows creating a buffer, writing a value, a worker updating it atomically, and the main thread reading the updated value. This process enables efficient shared memory communication between threads.

Practice

(1/5)
1. What is the main purpose of SharedArrayBuffer in Node.js?
easy
A. To create a memory area that multiple threads can access simultaneously
B. To store large strings efficiently
C. To replace regular arrays with faster versions
D. To handle file system operations asynchronously

Solution

  1. Step 1: Understand Shared Memory Concept

    SharedArrayBuffer is designed to create a block of memory that can be shared between multiple threads or workers.
  2. Step 2: Compare with Other Options

    Options B, C, and D describe unrelated features: string storage, array speed, and file system operations, which are not the purpose of SharedArrayBuffer.
  3. Final Answer:

    To create a memory area that multiple threads can access simultaneously -> Option A
  4. Quick Check:

    Shared memory = multiple threads access [OK]
Hint: SharedArrayBuffer is about sharing memory across threads [OK]
Common Mistakes:
  • Thinking it stores strings or files
  • Confusing with normal arrays
  • Assuming it handles async file tasks
2. Which of the following is the correct way to create a SharedArrayBuffer of 1024 bytes in Node.js?
easy
A. const sab = SharedArrayBuffer(1024);
B. const sab = SharedArrayBuffer.new(1024);
C. const sab = new SharedArrayBuffer();
D. const sab = new SharedArrayBuffer(1024);

Solution

  1. Step 1: Check the correct constructor usage

    The SharedArrayBuffer must be created with the new keyword and a size in bytes as argument.
  2. Step 2: Validate each option

    const sab = new SharedArrayBuffer(1024); uses new SharedArrayBuffer(1024), which is correct. const sab = SharedArrayBuffer(1024); misses new. const sab = new SharedArrayBuffer(); misses size argument. const sab = SharedArrayBuffer.new(1024); uses invalid syntax.
  3. Final Answer:

    const sab = new SharedArrayBuffer(1024); -> Option D
  4. Quick Check:

    Use new with size in bytes [OK]
Hint: Always use 'new' with SharedArrayBuffer and specify size [OK]
Common Mistakes:
  • Omitting 'new' keyword
  • Not providing size argument
  • Using incorrect constructor syntax
3. Given the code below, what will be the output?
const sab = new SharedArrayBuffer(4);
const int32 = new Int32Array(sab);
int32[0] = 10;
Atomics.add(int32, 0, 5);
console.log(int32[0]);
medium
A. 10
B. 5
C. 15
D. NaN

Solution

  1. Step 1: Understand initial value and Atomics.add

    The int32[0] is set to 10. Then Atomics.add adds 5 to this value atomically.
  2. Step 2: Calculate the new value

    10 + 5 = 15, so int32[0] becomes 15.
  3. Final Answer:

    15 -> Option C
  4. Quick Check:

    Atomics.add adds value safely = 15 [OK]
Hint: Atomics.add adds value and returns old value, array updates [OK]
Common Mistakes:
  • Expecting Atomics.add to return new value
  • Ignoring atomic operation effect
  • Confusing initial and updated values
4. What is wrong with the following code snippet?
const sab = new SharedArrayBuffer(8);
const uint8 = new Uint8Array(sab);
uint8[0] = 255;
Atomics.store(uint8, 0, 256);
console.log(uint8[0]);
medium
A. Atomics.store cannot be used with Uint8Array
B. 256 is out of range for Uint8Array element
C. SharedArrayBuffer size is too small
D. Uint8Array cannot be created from SharedArrayBuffer

Solution

  1. Step 1: Check Uint8Array element range

    Uint8Array elements can only hold values from 0 to 255. The value 256 is out of this range.
  2. Step 2: Understand effect of storing 256

    Storing 256 wraps around to 0 because 256 mod 256 = 0, so uint8[0] becomes 0, not 256.
  3. Final Answer:

    256 is out of range for Uint8Array element -> Option B
  4. Quick Check:

    Uint8 max value 255, 256 wraps to 0 [OK]
Hint: Uint8Array values must be 0-255; higher values wrap [OK]
Common Mistakes:
  • Assuming Atomics.store rejects Uint8Array
  • Ignoring value wrapping behavior
  • Thinking SharedArrayBuffer size is insufficient
5. You want to safely increment a shared counter in a Node.js worker thread using SharedArrayBuffer. Which code snippet correctly increments the counter without race conditions? // Shared buffer and typed array const sab = new SharedArrayBuffer(4); const counter = new Int32Array(sab); counter[0] = 0; // Increment function function increment() { // Which line correctly increments? }
hard
A. Atomics.add(counter, 0, 1);
B. counter[0] = counter[0] + 1;
C. counter[0] += 1;
D. counter[0]++;

Solution

  1. Step 1: Understand race conditions in shared memory

    Directly modifying counter[0] with normal operators can cause race conditions when multiple threads run concurrently.
  2. Step 2: Use atomic operations for safe increments

    Atomics.add(counter, 0, 1) safely increments the value at index 0 without conflicts.
  3. Final Answer:

    Atomics.add(counter, 0, 1); -> Option A
  4. Quick Check:

    Use Atomics for safe shared memory updates [OK]
Hint: Always use Atomics methods to update shared memory safely [OK]
Common Mistakes:
  • Using normal arithmetic on shared memory
  • Ignoring atomicity causing race conditions
  • Assuming ++ or += are thread-safe