import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author pengjunzhe
*/
public class FairAndUnfairTest {
private static Lock fairLock = new ReentrantLock2(true);
private static Lock unFairLock = new ReentrantLock2(false);
@Test
public void fair() {
testLock(fairLock);
}
@Test
public void unfair() {
testLock(unFairLock);
}
private void testLock(Lock lock) {
//TODO:启动5个Job
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new Job(lock), String.valueOf(i));
thread.start();
}
SleepUtils.second(2);
}
private static class Job extends Thread {
private Lock lock;
public Job(Lock lock) {
this.lock = lock;
}
@Override
public void run() {
// TODO:连续两次打印当前的Thread和等待队列中的Thread
for (int i = 0; i < 2; i++) {
lock.lock();
try {
System.out.println("Lock by["
+ Thread.currentThread().getName()
+ "]"
+ "Waiting by " + ((ReentrantLock2) lock).getQueuedThreadNames());
} finally {
lock.unlock();
}
}
}
}
private static class ReentrantLock2 extends ReentrantLock {
public ReentrantLock2(boolean fair) {
super(fair);
}
@Override
public Collection<Thread> getQueuedThreads() {
List<Thread> threads = new ArrayList<>(super.getQueuedThreads());
Collections.reverse(threads);
return threads;
}
public Collection<String> getQueuedThreadNames() {
List<String> names = new ArrayList<>(8);
getQueuedThreads().forEach((s) -> names.add(s.getName()));
return names;
}
}
}
输出分别为: Fair:
Lock by[0]Waiting by []
Lock by[1]Waiting by [2, 3, 4, 0]
Lock by[2]Waiting by [3, 4, 0, 1]
Lock by[3]Waiting by [4, 0, 1, 2]
Lock by[4]Waiting by [0, 1, 2, 3]
Lock by[0]Waiting by [1, 2, 3, 4]
Lock by[1]Waiting by [2, 3, 4]
Lock by[2]Waiting by [3, 4]
Lock by[3]Waiting by [4]
Lock by[4]Waiting by []
Unfair:
Lock by[0]Waiting by []
Lock by[0]Waiting by [1, 2, 3, 4]
Lock by[1]Waiting by [2, 3, 4]
Lock by[1]Waiting by [2, 3, 4]
Lock by[2]Waiting by [3, 4]
Lock by[2]Waiting by [3, 4]
Lock by[3]Waiting by [4]
Lock by[3]Waiting by [4]
Lock by[4]Waiting by []
Lock by[4]Waiting by []