// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.util.thread; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class LockerTest { public LockerTest() { } @Test public void testLocked() { Locker lock = new Locker(); assertFalse(lock.isLocked()); try(Locker.Lock l = lock.lock()) { assertTrue(lock.isLocked()); } finally { assertFalse(lock.isLocked()); } assertFalse(lock.isLocked()); } @Test public void testLockedException() { Locker lock = new Locker(); assertFalse(lock.isLocked()); try(Locker.Lock l = lock.lock()) { assertTrue(lock.isLocked()); throw new Exception(); } catch(Exception e) { assertFalse(lock.isLocked()); } finally { assertFalse(lock.isLocked()); } assertFalse(lock.isLocked()); } @Test public void testContend() throws Exception { final Locker lock = new Locker(); final CountDownLatch held0 = new CountDownLatch(1); final CountDownLatch hold0 = new CountDownLatch(1); Thread thread0 = new Thread() { @Override public void run() { try(Locker.Lock l = lock.lock()) { held0.countDown(); hold0.await(); } catch (InterruptedException e) { e.printStackTrace(); } } }; thread0.start(); held0.await(); assertTrue(lock.isLocked()); final CountDownLatch held1 = new CountDownLatch(1); final CountDownLatch hold1 = new CountDownLatch(1); Thread thread1 = new Thread() { @Override public void run() { try(Locker.Lock l = lock.lock()) { held1.countDown(); hold1.await(); } catch (InterruptedException e) { e.printStackTrace(); } } }; thread1.start(); // thread1 will be spinning here assertFalse(held1.await(100, TimeUnit.MILLISECONDS)); // Let thread0 complete hold0.countDown(); thread0.join(); // thread1 can progress held1.await(); // let thread1 complete hold1.countDown(); thread1.join(); assertFalse(lock.isLocked()); } }