StampedLock api详解

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

        }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章