Java Concurrency - Giao diện ReadWriteLock
Giao diện java.util.concurrent.locks.ReadWriteLock cho phép nhiều luồng đọc cùng một lúc nhưng chỉ một luồng có thể ghi tại một thời điểm.
Read Lock - Nếu không có luồng nào khóa ReadWriteLock để ghi thì nhiều luồng có thể truy cập vào khóa đọc.
Write Lock - Nếu không có luồng nào đang đọc hoặc ghi, thì một luồng có thể truy cập vào khóa ghi.
Phương thức khóa
Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp Khóa.
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | public Lock readLock() Trả về khóa được sử dụng để đọc. |
2 | public Lock writeLock() Trả về khóa được sử dụng để viết. |
Thí dụ
Chương trình TestThread sau đây trình bày các phương thức này của giao diện ReadWriteLock. Ở đây chúng tôi đã sử dụng readlock () để có được khóa đọc và writeLock () để có được khóa ghi.import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TestThread {
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
private static String message = "a";
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new WriterA());
t1.setName("Writer A");
Thread t2 = new Thread(new WriterB());
t2.setName("Writer B");
Thread t3 = new Thread(new Reader());
t3.setName("Reader");
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
}
static class Reader implements Runnable {
public void run() {
if(lock.isWriteLocked()) {
System.out.println("Write Lock Present.");
}
lock.readLock().lock();
try {
Long duration = (long) (Math.random() * 10000);
System.out.println(Thread.currentThread().getName()
+ " Time Taken " + (duration / 1000) + " seconds.");
Thread.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName() +": "+ message );
lock.readLock().unlock();
}
}
}
static class WriterA implements Runnable {
public void run() {
lock.writeLock().lock();
try {
Long duration = (long) (Math.random() * 10000);
System.out.println(Thread.currentThread().getName()
+ " Time Taken " + (duration / 1000) + " seconds.");
Thread.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
message = message.concat("a");
lock.writeLock().unlock();
}
}
}
static class WriterB implements Runnable {
public void run() {
lock.writeLock().lock();
try {
Long duration = (long) (Math.random() * 10000);
System.out.println(Thread.currentThread().getName()
+ " Time Taken " + (duration / 1000) + " seconds.");
Thread.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
message = message.concat("b");
lock.writeLock().unlock();
}
}
}
}
Điều này sẽ tạo ra kết quả sau.
Đầu ra
Writer A Time Taken 6 seconds.
Write Lock Present.
Writer B Time Taken 2 seconds.
Reader Time Taken 0 seconds.
Reader: aab