What is StampedLock in Java?

前端 未结 4 1674
清酒与你
清酒与你 2020-12-24 12:50

I am working on a Java code, I need to implement threading in it. I was going through JAVA 8 API and I come to know about Stamped Locks. Can anyone tell me why to use Stampe

4条回答
  •  一向
    一向 (楼主)
    2020-12-24 13:22

    StampedLock support read and write locks. In contrast to ReadWriteLock the locking methods of a StampedLock return a stamp represented by a long value. You can use these stamps to either release a lock or to check if the lock is still valid. Additionally stamped locks support another lock mode called optimistic locking.

    ExecutorService executor = Executors.newFixedThreadPool(2);
            Map map = new HashMap<>();
            StampedLock lock = new StampedLock();
    
            executor.submit(() -> {
                long stamp = lock.writeLock();
                try {
                    Thread.sleep(100);
                    map.put("test", "INDIA");
                } catch (Exception e) {
                } finally {
                    lock.unlockWrite(stamp);
                }
            });
    
            Runnable readTask = () -> {
                long stamp = lock.readLock();
                try {
                    System.out.println(map.get("test"));
                    Thread.sleep(100);
                } catch (Exception e) {
                } finally {
                    lock.unlockRead(stamp);
                }
            };
    
            executor.submit(readTask);
            executor.submit(readTask);
    

    Obtaining a read or write lock via readLock() or writeLock() returns a stamp which is later used for unlocking within the finally block. Keep in mind that stamped locks don't implement reentrant characteristics. Each call to lock returns a new stamp and blocks if no lock is available even if the same thread already holds a lock. So you have to pay particular attention not to run into deadlocks.

    executor.submit(() -> {
                long stamp = lock.tryOptimisticRead();
                try {
                    System.out.println("Optimistic Lock Valid: " + lock.validate(stamp));
                    Thread.sleep(100);
                    System.out.println("Optimistic Lock Valid: " + lock.validate(stamp));
                    Thread.sleep(1000);
                    System.out.println("Optimistic Lock Valid: " + lock.validate(stamp));
                } catch (Exception e) {
                } finally {
                    lock.unlock(stamp);
                }
            });
    
            executor.submit(() -> {
                long stamp = lock.writeLock();
                try {
                    System.out.println("Write Lock acquired");
                    Thread.sleep(100);
                } catch (Exception e) {
                } finally {
                    lock.unlock(stamp);
                    System.out.println("Write done");
                }
            });
    

    An optimistic read lock is acquired by calling tryOptimisticRead() which always returns a stamp without blocking the current thread, no matter if the lock is actually available. If there's already a write lock active the returned stamp equals zero. You can always check if a stamp is valid by calling lock.validate(stamp).

提交回复
热议问题