package org.infinispan.lock; import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.util.concurrent.TimeoutException; import org.infinispan.util.concurrent.locks.impl.PerKeyLockContainer; import org.testng.annotations.Test; @Test (groups = "functional", testName = "lock.SimpleLockContainerTest") public class SimpleLockContainerTest extends AbstractInfinispanTest { PerKeyLockContainer lc = new PerKeyLockContainer(); public void simpleTest() throws Exception { lc.inject(TIME_SERVICE); final String k1 = ab(); final String k2 = ab2(); assert k1 != k2 && k1.equals(k2); Object owner = new Object(); lc.acquire(k1, owner, 0, TimeUnit.MILLISECONDS).lock(); assert lc.getLock(k1).isLocked(); Future<Void> f = fork(new Callable<Void>() { @Override public Void call() throws InterruptedException, TimeoutException { final Object otherOwner = new Object(); for (int i =0; i < 10; i++) { try { lc.acquire(k2, otherOwner, 500, TimeUnit.MILLISECONDS).lock(); return null; } catch (TimeoutException e) { //ignored } } throw new TimeoutException("We should have acquired lock!"); } }); Thread.sleep(200); lc.release(k1, owner); f.get(10, TimeUnit.SECONDS); } private String ab2() { return "ab"; } public String ab() { StringBuilder sb = new StringBuilder("a"); return sb.append("b").toString(); } }