java8-StampedLock

来源:互联网 发布:c数据库入门经典 编辑:程序博客网 时间:2024/06/05 00:22
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释放读锁...