Lock
- Lock.lock 進(jìn)入鎖
- Lock.unLock 釋放鎖
- Lock.tryLock 獲取鎖 (return boolean)
ReentrantLock 可重入鎖
- 創(chuàng)建ReentrantLock 默認(rèn)情況下是非公平鎖
- new ReentrantLock(true) 這樣是公平鎖
- synchronized 也是非公平鎖
- synchronized 和 ReentrantLock 都是排它鎖颖杏,也就是同一時(shí)間只能擁有一個(gè)鎖
private Lock lock = new ReentrantLock();
private int count = 1;
/**
* 必須要try finally
* 因?yàn)閠ry 的流程出現(xiàn)異常片迅,會(huì)導(dǎo)致鎖無法釋放
* 無法釋放鎖,可能會(huì)導(dǎo)致哪一塊空間無法釋放读拆,其他線程無法獲取鎖
*/
public void test() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
ReentrantReadWriteLock 可重入的讀寫鎖
- 之前說 synchronized 和 ReentrantLock 都是排它鎖;而ReentrantReadWriteLock是一種包含排它鎖和共享鎖的鎖骑科。
- 在保證數(shù)據(jù)一致性的情況下褪贵,在進(jìn)入讀鎖的情況下匣摘,不允許寫入亏吝,也就是無法進(jìn)入寫鎖岭埠;反之,在寫鎖的情況下蔚鸥,也無法進(jìn)入讀取操作惜论,也就是無法進(jìn)入讀鎖。
- 讀的時(shí)候止喷,可以有多個(gè)讀線程進(jìn)入馆类,這是不允許寫;寫的時(shí)候弹谁,只有這個(gè)寫的線程可以進(jìn)行蹦掐,任何其他的寫線程或者讀線程都不被允許。
- 這個(gè)鎖存在是因?yàn)樽x的操作大于寫的操作僵闯,也就是一個(gè)程序中卧抗,讀數(shù)據(jù)的功能會(huì)大于寫功能;所以基本狀況也就是讀鎖多于寫鎖鳖粟。
- 相對于synchronized 和 ReentrantLock社裆,ReentrantReadWriteLock的效率更高。
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
private Lock readLock = reentrantReadWriteLock.readLock();
private Lock writeLock = reentrantReadWriteLock.writeLock();
private int count = 1;
public int readData() {
readLock.lock();
try {
return count;
} finally {
readLock.unlock();
}
}
public void writeData() {
writeLock.lock();
try {
count += 1;
} finally {
writeLock.unlock();
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者