今天學習StampedLock,該類是JUC原子包中的類,通過單元測試代碼把所有public api方法跑了一遍,大致瞭解了底層實現,初學乍練,有很多一知半解的地方,待後續有了深入理解再來補充
package test.java.util.concurrent.locks;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.StampedLock;
import org.junit.Test;
/**
* StampedLock的測試類
*
* @author zqw
* @date 2020-06-23 20:59:27
*/
public class StampedLockTest {
/**
* 無參構造函數
* 初始化無鎖狀態,1L <<7 << 1 256
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testConstruct0()throws Exception{
StampedLock testObj=new StampedLock();
System.out.println(testObj.toString());
}
/**
* 獲取寫鎖long值
* 釋放寫鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testWriteLock()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.writeLock();
System.out.println(testObj.isWriteLocked());
System.out.println("鎖:"+writeLock);
testObj.unlockWrite(writeLock);
System.out.println(testObj.isWriteLocked());
}
/**
* 嘗試獲取寫鎖long值
* 釋放寫鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryWriteLock()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.tryWriteLock();
System.out.println(testObj.isWriteLocked());
System.out.println("鎖:"+writeLock);
testObj.unlockWrite(writeLock);
System.out.println(testObj.isWriteLocked());
}
/**
* 嘗試獲取寫鎖long值,超過時間則返回0
* 釋放寫鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryWriteLockForTime()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.tryWriteLock(2000,TimeUnit.MILLISECONDS);
System.out.println(testObj.isWriteLocked());
System.out.println("鎖:"+writeLock);
testObj.unlockWrite(writeLock);
System.out.println(testObj.isWriteLocked());
}
/**
* 獲取寫鎖long值,如果沒有獲取到則當前線程等待,直到獲得
* 鎖或者被其他線程中斷
* 釋放寫鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testWriteLockInterruptibly()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.writeLockInterruptibly();
System.out.println(testObj.isWriteLocked());
System.out.println("鎖:"+writeLock);
testObj.unlockWrite(writeLock);
System.out.println(testObj.isWriteLocked());
}
/**
* 獲取讀鎖long值
* 釋放讀鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testReadLock()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.readLock();
System.out.println(testObj.isReadLocked());
System.out.println("鎖:"+readLock);
testObj.unlockRead(readLock);
System.out.println(testObj.isReadLocked());
}
/**
* 嘗試獲取讀鎖long值
* 釋放讀鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryReadLock()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.tryReadLock();
System.out.println(testObj.isReadLocked());
System.out.println("鎖:"+readLock);
testObj.unlockRead(readLock);
System.out.println(testObj.isReadLocked());
}
/**
* 嘗試獲取讀鎖long值,超過時間則返回0
* 釋放讀鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryReadLockForTime()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.tryReadLock(2000,TimeUnit.MILLISECONDS);
System.out.println(testObj.isReadLocked());
System.out.println("鎖:"+readLock);
testObj.unlockRead(readLock);
System.out.println(testObj.isReadLocked());
}
/**
* 獲取讀鎖long值,如果沒有獲取到則當前線程等待,直到獲得
* 鎖或者被其他線程中斷
* 釋放讀鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testReadLockInterruptibly()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.readLockInterruptibly();
System.out.println(testObj.isReadLocked());
System.out.println("鎖:"+readLock);
testObj.unlockRead(readLock);
System.out.println(testObj.isReadLocked());
}
/**
* 嘗試獲取樂觀讀鎖long值
* 釋放樂觀讀鎖long值
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryOptimisticRead()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.tryOptimisticRead();
try {
System.out.println("鎖:"+readLock);
System.out.println(testObj.validate(readLock));
}catch (Exception e){}
finally {
try {
testObj.unlockRead(readLock);
}catch (Exception e) {
// TODO: handle exception
System.out.println("已經被write鎖鎖了");
}
}
}
/**
* 檢驗鎖是否被佔用,使用了loadFence內存屏障
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testValidate()throws Exception{
StampedLock testObj=new StampedLock();
long stamp=testObj.readLock();
System.out.println(testObj.validate(stamp));
}
/**
* 測試釋放寫鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testUnlockWrite()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.writeLock();
System.out.println(testObj.isWriteLocked());
testObj.unlockWrite(writeLock);
System.out.println(testObj.isWriteLocked());
}
/**
* 測試釋放讀鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testUnlockRead()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.readLock();
System.out.println(testObj.isReadLocked());
testObj.unlockRead(readLock);
System.out.println(testObj.isReadLocked());
}
/**
* 測試釋放鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testUnlock()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.readLock();
System.out.println(testObj.isReadLocked());
testObj.unlock(readLock);
System.out.println(testObj.isReadLocked());
}
/**
* 嘗試轉換到寫鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryConvertToWriteLock()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.readLock();
System.out.println(testObj.isReadLocked());
long writeLock=testObj.tryConvertToWriteLock(readLock);
System.out.println(testObj.isReadLocked());
System.out.println(testObj.isWriteLocked());
// testObj.unlock(readLock);
testObj.unlock(writeLock);
System.out.println(testObj.isReadLocked());
System.out.println(testObj.isWriteLocked());
}
/**
* 嘗試轉換到讀鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryConvertToReadLock()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.writeLock();
System.out.println(testObj.isWriteLocked());
System.out.println("寫鎖:"+writeLock);
long readLock=testObj.tryConvertToReadLock(writeLock);
System.out.println("讀鎖:"+readLock);
System.out.println(testObj.isReadLocked());
System.out.println(testObj.isWriteLocked());
testObj.unlock(readLock);
// testObj.unlock(writeLock);
System.out.println(testObj.isReadLocked());
System.out.println(testObj.isWriteLocked());
}
/**
* 嘗試轉換到樂觀讀鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryConvertToOptimisticRead()throws Exception{
StampedLock testObj=new StampedLock();
long writeLock=testObj.writeLock();
System.out.println(testObj.isWriteLocked());
System.out.println("寫鎖:"+writeLock);
long readLock=testObj.tryConvertToOptimisticRead(writeLock);
System.out.println("讀鎖:"+readLock);
System.out.println(testObj.isReadLocked());
System.out.println(testObj.isWriteLocked());
// testObj.unlock(readLock);??????????報錯
// testObj.unlock(writeLock);
System.out.println(testObj.isReadLocked());
System.out.println(testObj.isWriteLocked());
}
/**
* 嘗試釋放寫鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryUnlockWrite()throws Exception{
StampedLock testObj=new StampedLock();
testObj.writeLock();
System.out.println(testObj.isWriteLocked());
testObj.tryUnlockWrite();
System.out.println(testObj.isWriteLocked());
}
/**
* 嘗試釋放讀鎖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testTryUnlockRead()throws Exception{
StampedLock testObj=new StampedLock();
testObj.readLock();
System.out.println(testObj.isReadLocked());
testObj.tryUnlockRead();
System.out.println(testObj.isReadLocked());
}
/**
* 寫鎖是否被持有
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testIsWriteLocked()throws Exception{
StampedLock testObj=new StampedLock();
testObj.writeLock();
System.out.println(testObj.isWriteLocked());
}
/**
* 讀鎖是否被持有
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testIsReadLocked()throws Exception{
StampedLock testObj=new StampedLock();
long readLock=testObj.readLock();
System.out.println(testObj.isReadLocked());
}
/**
* 查詢重入讀鎖次數
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testGetReadLockCount()throws Exception{
StampedLock testObj=new StampedLock();
long readLock1=testObj.readLock();
long readLock2=testObj.readLock();
long readLock3=testObj.readLock();
System.out.println(testObj.getReadLockCount());
}
/**
* 測試toString
* java.util.concurrent.locks.StampedLock@14514713[Unlocked]
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testToString()throws Exception{
StampedLock testObj=new StampedLock();
System.out.println(testObj.toString());
}
/**
*獲取readLockView 即讀鎖視圖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testAsReadLock()throws Exception{
StampedLock testObj=new StampedLock();
testObj.asReadLock().lock();
System.out.println(testObj.isReadLocked());
testObj.asReadLock().unlock();
System.out.println(testObj.isReadLocked());
}
/**
*獲取writeLockView 即讀鎖視圖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testAsWriteLock()throws Exception{
StampedLock testObj=new StampedLock();
testObj.asWriteLock().lock();
System.out.println(testObj.isWriteLocked());
testObj.asWriteLock().unlock();
System.out.println(testObj.isWriteLocked());
}
/**
*獲取readWriteLockView,即讀寫鎖視圖
* void
* @Param
* @author zhqwm
* @date 2020/6/23 22:34
*/
@Test
public void testAsReadWriteLock()throws Exception{
StampedLock testObj=new StampedLock();
testObj.asReadWriteLock().readLock().lock();
System.out.println(testObj.isReadLocked());
testObj.asReadWriteLock().readLock().unlock();
System.out.println(testObj.isReadLocked());
}
}