 	func dequeueSignalProducer() -> SignalProducer<T, E>? {
 		var nextSignalProducer: SignalProducer<T, E>?
 
-		lock()
-		// Active producers are left in the queue until completion. Dequeueing
-		// only happens when the last active producer has completed, so it can
-		// be removed from the queue.
-		self.queuedSignalProducers.removeAtIndex(0)
-		nextSignalProducer = self.queuedSignalProducers.first
-		unlock()
+		queuedSignalProducers.modify { (var queue) in
+			// Active producers are left in the queue until completion. Dequeueing
+			// only happens when the last active producer has completed, so it can
+			// be removed from the queue.
+			queue.removeAtIndex(0)
+			nextSignalProducer = queue.first
+			return queue
+		}
 
 		return nextSignalProducer
 	}

	func enqueueSignalProducer(producer: SignalProducer<T, E>) {
		var shouldStart = true

		lock()
		// An empty queue means the concat is idle, ready & waiting to start the
		// next producer given.
		shouldStart = self.queuedSignalProducers.isEmpty
		self.queuedSignalProducers.append(producer)
		unlock()

		if shouldStart {
			startNextSignalProducer(producer)

	let disposable: CompositeDisposable

	/// The signals waiting to be started.
	var queuedSignalProducers: Atomic<[SignalProducer<T, E>]> = Atomic([])

	init(observer: Signal<T, E>.Observer, disposable: CompositeDisposable) {
		self.observer = observer
