package com.thread.utils.statmp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.StampedLock;
import java.util.stream.Collectors;
public class StampedLockExample2 {
//private final static ReentrantLock lock = new ReentrantLock();
private final static StampedLock lock = new StampedLock();
private final static List<Long> data = new ArrayList<>();
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(10);
Runnable readTask = () -> {
for (; ; ) {
read();
}
};
Runnable writeTask = () -> {
for (; ; ) {
writer();
}
};
for (int i = 0; i < 9; i++) {
service.submit(readTask);
}
service.submit(writeTask);
}
private static void read() {
long stamped = lock.tryOptimisticRead();
System.err.println(stamped);
if (lock.validate(stamped)) {
try {
stamped = lock.readLock();
Optional.of(data.stream().map(String::valueOf).collect(Collectors.joining("#", "readlock=>[", "]")))
.ifPresent(System.out::println);
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlockRead(stamped);
}
}
}
private static void writer() {
long stamped = -1;
try {
stamped = lock.writeLock();
data.add(System.currentTimeMillis());
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlockWrite(stamped);
}
}
}