A bulkhead is a way of partitioning shared resources, usually threads, connection pool slots, or memory, so that each consumer gets its own fixed allocation. When one consumer uses up its allocation, it gets rejected or queued, but it cannot reach into and drain the slots reserved for everyone else.
The classic failure it prevents is resource exhaustion cascading across a service. Imagine a service that calls three downstream APIs from one shared pool of 100 threads. If one of those APIs slows down to 5 seconds per call, requests pile up waiting on it, and within seconds all 100 threads are blocked on the slow dependency. Now calls to the other two healthy APIs also fail, because there are no free threads left. The slow dependency took down everything.
With bulkheads you split that pool: 40 threads for API A, 30 for API B, 30 for API C. When API A goes slow, it can only ever block its own 40 threads. API B and C keep serving traffic. You traded some peak capacity for the guarantee that one bad dependency stays contained.