今天学习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());
}
}