JUC读写锁

/**
 *  读写锁:一个资源可以被多个读线程访问,也可以被多个写线程访问,但是不能同时存在读和写两个线程
 *  读读可以共享,读写不能共存,写写不能共存,Synchronized和Lock都是可重入锁
 *  synchronized是一个关键字,由系统帮助我们释放锁,Lock是一个类,需要我们手动加锁
 *  手动释放锁,如果忘记释放锁,线程会进入到死锁的状态,死锁的原因:资源分配不当,
 *  资源不足,死锁的现象:多个线程,占据对方需要同步的资源,同时在等待对方,释放自己
 *  需要同步的资源
 */
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();
Lock writeLock = readWriteLock.writeLock();
for (int i = 0; i < 5; i++) {
    new Thread(() -> {
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"\t开始写数据");
            try { TimeUnit.SECONDS.sleep(new Random().nextInt(5)); } catch(InterruptedException e) { e.printStackTrace(); }
            System.out.println(Thread.currentThread().getName()+"\t写完数据");
        } finally {
            writeLock.unlock();
        }
    }, String.valueOf(i)).start();
}
for (int i = 0; i < 5; i++) {
    new Thread(() -> {
        readLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"\t开始读数据");
            try { TimeUnit.SECONDS.sleep(new Random().nextInt(5)); } catch(InterruptedException e) { e.printStackTrace(); }
            System.out.println(Thread.currentThread().getName()+"\t读完数据");
        } finally {
            readLock.unlock();
        }
    }, String.valueOf(i)).start();
}
上一篇:多线程笔记 | 通过匿名类创建 Runnable 线程


下一篇:Java线程优先级