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 []
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句