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());

        }
}

 

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