1、公平選擇性,支持非公平和公平鎖獲取,吞吐量不公平優(yōu)于公平。
2、重進(jìn)入,讀鎖和寫鎖都支持線程重進(jìn)入。
3、鎖降級(jí),遵循獲取寫鎖、獲取讀鎖、釋放寫鎖的順序,寫鎖可以降級(jí)為讀鎖。
實(shí)例
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 {
//共享數(shù)據(jù),只能有一個(gè)線程能寫該數(shù)據(jù),但可以有多個(gè)線程同時(shí)讀該數(shù)據(jù)。
ReadWriteLock rwl = new ReentrantReadWriteLock();
private Object data = null;//共享數(shù)據(jù),只能有一個(gè)線程能寫數(shù)據(jù),但可以有多個(gè)線程讀該數(shù)據(jù)
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讀寫鎖的特性,希望對(duì)大家有所幫助。更多關(guān)于“java培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來試聽。