import java.util.concurrent.locks.StampedLock;
public class Test {
private String str = "init" ;
private final StampedLock stampedLock = new StampedLock();
public static void main(String[] args) {
final Test test = new Test();
new Thread(() -> test.write(Thread.currentThread()),"B" ) .start () ;
new Thread (() -> test.read(Thread.currentThread()),"A" ) .start () ;
new Thread (() -> test.read(Thread.currentThread()),"C" ) .start () ;
new Thread (() -> test.write(Thread.currentThread()),"D" ) .start () ;
}
public void read (Thread thread) {
long stamp = stampedLock .tryOptimisticRead () ;
try {
System .out .println ("线程" + thread.getName() + "开始读操作..." ) ;
System .out .println ("线程" + thread.getName() + "读出..." + str) ;
Thread .sleep (5 ) ;
if (!stampedLock.validate(stamp)) {
System .out .println ("线程" + thread.getName() + "票据失效,等待重新开始读操作..." ) ;
stamp = stampedLock .readLock () ; //读锁
System .out .println ("线程" + thread.getName() + "重新开始读操作..." ) ;
System .out .println ("线程" + thread.getName() + "读出..." + str) ;
}
System .out .println ("线程" + thread.getName() + "读操作完毕..." ) ;
} catch (Exception e) {
e .printStackTrace () ;
} finally {
System .out .println ("线程" + thread.getName() + "释放读锁..." ) ;
stampedLock .unlockRead (stamp) ;//释放读锁
}
}
public void write (Thread thread) {
long stamp = stampedLock .writeLock () ; //写锁
try {
System .out .println ("线程" + thread.getName() + "开始写操作..." ) ;
for (int i = 1 ; i < 10 ; i++) {
str = "写入" + i ;
Thread .sleep (5 ) ;
}
System .out .println ("线程" + thread.getName() + "写操作完毕..." ) ;
} catch (InterruptedException e) {
e .printStackTrace () ;
} finally {
System .out .println ("线程" + thread.getName() + "释放写锁..." ) ;
stampedLock .unlockWrite (stamp) ;//释放写锁
}
}
}
线程B开始写操作...
线程A开始读操作...
线程A读出... 写入1
线程C开始读操作...
线程C读出... 写入1
线程A票据失效,等待重新开始读操作...
线程C票据失效,等待重新开始读操作...
线程B写操作完毕...
线程B释放写锁...
线程D开始写操作...
线程D写操作完毕...
线程D释放写锁...
线程A重新开始读操作...
线程C重新开始读操作...
线程C读出... 写入9
线程A读出... 写入9
线程C读操作完毕...
线程A读操作完毕...
线程A释放读锁...
线程C释放读锁...