ReetrantReadWriteLock读读共享
ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
//读读共享
new Thread(() -> {
readLock.lock();
System.out.println(Thread.currentThread().getName() + "开始加锁");
try {
System.out.println("处理业务");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放锁");
}
}).start();
new Thread(() -> {
readLock.lock();
System.out.println(Thread.currentThread().getName() + "开始加锁");
try {
System.out.println("处理业务");
} finally {
readLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放锁");
}
}).start();
执行结果
Thread-0开始加锁
处理业务
Thread-1开始加锁
处理业务
Thread-1释放锁
Thread-0释放锁
可以看出Thread-1无须待Thread-0释放锁之后才加锁。
ReetrantReadWriteLock读写互斥
ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
//读写互斥
new Thread(() -> {
writeLock.lock();
System.out.println(Thread.currentThread().getName() + "开始加锁");
try {
System.out.println("处理业务");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
writeLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放锁");
}
}).start();
new Thread(() -> {
readLock.lock();
System.out.println(Thread.currentThread().getName() + "开始加锁");
try {
System.out.println("处理业务");
} finally {
readLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放锁");
}
}).start();
Thread-0开始加锁
处理业务
Thread-0释放锁
Thread-1开始加锁
处理业务
Thread-1释放锁
可以看出Thread-1必须在Thread-0释放锁之后才能进行加锁操作。
ReetrantReadWriteLock写写互斥
ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
//写写互斥
new Thread(() -> {
writeLock.lock();
System.out.println(Thread.currentThread().getName() + "开始加锁");
try {
System.out.println("处理业务");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
writeLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放锁");
}
}).start();
new Thread(() -> {
writeLock.lock();
System.out.println(Thread.currentThread().getName() + "开始加锁");
try {
System.out.println("处理业务");
} finally {
writeLock.unlock();
System.out.println(Thread.currentThread().getName() + "释放锁");
}
}).start();
Thread-0开始加锁
处理业务
Thread-0释放锁
Thread-1开始加锁
处理业务
Thread-1释放锁
可以看出Thread-1必须在Thread-0释放锁之后才能进行加锁操作。