说明:参考《Java多线程核心技术》
9、ReentrantReadWriteLock
1、读读共享:读锁之间不排斥
public class ReadShareService {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void read() {
try {
try {
lock.readLock().lock();
System.out.println("get readLock" + Thread.currentThread().getName()
+ " " + System.currentTimeMillis());
Thread.sleep(1000);
}finally {
lock.readLock().unlock();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadA extends Thread{
private ReadShareService service;
public ThreadA(ReadShareService service) {
super();
this.service = service;
}
@Override
public void run() {
service.read();
}
}
public class ThreadB extends Thread{
private ReadShareService service;
public ThreadB(ReadShareService service) {
super();
this.service = service;
}
@Override
public void run() {
service.read();
}
}
public class ReadSharedTest {
public static void main(String[] args) {
ReadShareService service = new ReadShareService();
ThreadA threadA = new ThreadA(service);
threadA.setName("A");
ThreadB threadB = new ThreadB(service);
threadB.setName("B");
threadA.start();
threadB.start();
}
}
/**
get readLockA 1547042759434
get readLockB 1547042759434
*/
2、写写互斥:写锁之间互斥
public class WriteMutexService {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void write() {
try {
try {
lock.writeLock().lock();
System.out.println("get writeLock" + Thread.currentThread().getName()
+ " " + System.currentTimeMillis());
Thread.sleep(1000);
}finally {
lock.writeLock().unlock();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadA extends Thread{
private WriteMutexService service;
public ThreadA(WriteMutexService service) {
super();
this.service = service;
}
@Override
public void run() {
service.write();
}
}
public class ThreadB extends Thread{
private WriteMutexService service;
public ThreadB(WriteMutexService service) {
super();
this.service = service;
}
@Override
public void run() {
service.write();
}
}
public class WriteMutexTest {
public static void main(String[] args) {
WriteMutexService service = new WriteMutexService();
ThreadA threadA = new ThreadA(service);
threadA.setName("A");
ThreadB threadB = new ThreadB(service);
threadB.setName("B");
threadA.start();
threadB.start();
}
}
/**
get writeLockA 1547043671424
get writeLockB 1547043672438
*/
3、读写互斥
public class WriteMutexService {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public void write() {
try {
try {
lock.writeLock().lock();
System.out.println("get writeLock" + Thread.currentThread().getName()
+ " " + System.currentTimeMillis());
Thread.sleep(2000);
}finally {
lock.writeLock().unlock();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
public void read() {
try {
try {
lock.readLock().lock();
System.out.println("get readLock" + Thread.currentThread().getName()
+ " " + System.currentTimeMillis());
Thread.sleep(2000);
}finally {
lock.readLock().unlock();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ThreadA extends Thread{
private WriteMutexService service;
public ThreadA(WriteMutexService service) {
super();
this.service = service;
}
@Override
public void run() {
service.write();
}
}
public class ThreadB extends Thread{
private WriteMutexService service;
public ThreadB(WriteMutexService service) {
super();
this.service = service;
}
@Override
public void run() {
service.read();
}
}
public class WriteMutexTest {
public static void main(String[] args) throws InterruptedException {
WriteMutexService service = new WriteMutexService();
ThreadA threadA = new ThreadA(service);
threadA.setName("A");
threadA.start();
Thread.sleep(1000);
ThreadB threadB = new ThreadB(service);
threadB.setName("B");
threadB.start();
}
}
/**
get writeLockA 1547044041211
get readLockB 1547044043224
*/