46 lines
1.2 KiB
Java
46 lines
1.2 KiB
Java
|
package org.warp.filesponge;
|
||
|
|
||
|
import java.util.LinkedList;
|
||
|
import java.util.List;
|
||
|
import org.junit.jupiter.api.Test;
|
||
|
import reactor.core.publisher.Flux;
|
||
|
import reactor.core.publisher.Mono;
|
||
|
import reactor.core.scheduler.Scheduler;
|
||
|
import reactor.core.scheduler.Schedulers;
|
||
|
import reactor.test.StepVerifier;
|
||
|
|
||
|
public class ThreadSafety {
|
||
|
|
||
|
@Test
|
||
|
public void threadSafety() {
|
||
|
Scheduler schedulerSingle = Schedulers.newSingle("treadSafeScheduler");
|
||
|
Scheduler schedulerParallel = Schedulers.newParallel("threadUnsafeScheduler", 20);
|
||
|
|
||
|
int iterations = 500;
|
||
|
List<Integer> list = new LinkedList<>();
|
||
|
|
||
|
var flux = Flux.range(0, iterations)
|
||
|
.flatMap(s -> Mono.fromCallable(() -> {
|
||
|
list.add(s);
|
||
|
return s;
|
||
|
}).then(Mono.fromCallable(() -> {
|
||
|
list.add(1);
|
||
|
return s;
|
||
|
})).subscribeOn(schedulerSingle))
|
||
|
.ignoreElements()
|
||
|
.thenMany(Flux.defer(() -> Flux.fromIterable(list)))
|
||
|
.subscribeOn(schedulerParallel);
|
||
|
|
||
|
Integer[] checks = new Integer[iterations * 2];
|
||
|
for (int i = 0; i < iterations; i++) {
|
||
|
checks[i * 2] = i;
|
||
|
checks[i * 2 + 1] = 1;
|
||
|
}
|
||
|
StepVerifier
|
||
|
.create(flux)
|
||
|
.expectSubscription()
|
||
|
.expectNext(checks)
|
||
|
.verifyComplete();
|
||
|
}
|
||
|
}
|