1、公平選擇性,支持非公平和公平鎖獲取,吞吐量不公平優于公平。
2、重進入,讀鎖和寫鎖都支持線程重進入。
3、鎖降級,遵循獲取寫鎖、獲取讀鎖、釋放寫鎖的順序,寫鎖可以降級為讀鎖。
實例
public class ReadWriteLockTest {
public static void main(String[] args) {
final Queue q = new Queue();
for (int i = 0; i < 3; i++) {
new Thread() {
@Override
public void run() {
while (true) {
q.get();
}
}
}.start();
new Thread() {
@Override
public void run() {
while (true) {
q.put(new Random().nextInt(10000));
}
}
}.start();
}
}
}
class Queue {
//共享數據,只能有一個線程能寫該數據,但可以有多個線程同時讀該數據。
ReadWriteLock rwl = new ReentrantReadWriteLock();
private Object data = null;//共享數據,只能有一個線程能寫數據,但可以有多個線程讀該數據
public void get() {
//上讀鎖,其他線程只能讀不能寫
rwl.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " be ready to read data!");
Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName() + " have read data :" + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
rwl.readLock().unlock();
}
}
public void put(Object data) {
//上寫鎖,不允許其他線程讀也不允許寫
rwl.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " be ready to write data!");
Thread.sleep((long) (Math.random() * 1000));
this.data = data;
System.out.println(Thread.currentThread().getName() + " have write data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
rwl.writeLock().unlock();
}
}
}
以上就是java讀寫鎖的特性,希望對大家有所幫助。更多關于“java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業需求,更科學更嚴謹,每年培養泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。