blob: 640998ce337f87ed49de7317a87f1f826222fd0d [file] [log] [blame]
/*
* Copyright (c) 2016 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.util.tests;
import org.eclipse.net4j.util.concurrent.NonFairReentrantLock;
import org.eclipse.net4j.util.concurrent.QueueRunner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Lock;
/**
* @author Eike Stepper
* @since 3.6
*/
public class NonFairReentrantLockTest
{
public static void main(String[] args) throws Exception
{
final QueueRunner eventQueue = new QueueRunner();
eventQueue.activate();
final Lock lock = new NonFairReentrantLock()
{
private static final long serialVersionUID = 1L;
@Override
protected boolean isOwner(Thread thread, Thread owner)
{
if (super.isOwner(thread, owner))
{
return true;
}
// State state = owner.getState();
// if (state == State.WAITING)
// {
// StackTraceElement[] stackTrace = owner.getStackTrace();
//
// }
return thread == eventQueue.getWorkerThread();
}
};
/**
* @author Eike Stepper
*/
class Event implements Runnable
{
CountDownLatch latch = new CountDownLatch(1);
public void run()
{
System.out.println("event");
lock.lock();
try
{
System.out.println("forked");
}
finally
{
lock.unlock();
latch.countDown();
}
}
}
Thread[] threads = new Thread[20];
for (int i = 0; i < threads.length; i++)
{
threads[i] = new Thread()
{
@Override
public void run()
{
lock.lock();
try
{
nested();
}
finally
{
lock.unlock();
}
}
private void nested()
{
lock.lock();
System.out.println("nested");
try
{
Event event = new Event();
eventQueue.addWork(event);
try
{
event.latch.await();
}
catch (Throwable ex)
{
//$FALL-THROUGH$
}
}
finally
{
lock.unlock();
}
}
};
threads[i].start();
}
for (int i = 0; i < threads.length; i++)
{
threads[i].join();
}
eventQueue.deactivate();
}
}