1. 背景
假设:有10个线程,如何让他们顺序执行?
解答:可以使用 多线程配合 "公平锁" 来实现。
涉及到 Thread, ReentrantLock
2.知识
公平锁就是保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁,而非公平锁则无法提供这个保障。
某个线程尝试获取锁时,先会尝试 CAS ,失败后会把自己放入 这个是锁的等待队列,这时队列里多个等待锁的顺序如果是有序的,就是公平锁,如果无序则是非公平锁。
Java 中的 ReentrantLock 构造函数可以默认的锁策略是非公平锁。
ReentrantLock reentrantLock = new ReentrantLock(); // 默认 "不公平锁"
boolean isFair = true; // 是否 公平锁
ReentrantLock reentrantLock2 = new ReentrantLock(isFair); // 这个构造方法可以产出 "公平锁"
3. 示例
上代码:
public class Main {
static class MyService {
ReentrantLock reentrantLock = new ReentrantLock(true);
void doSome() {
reentrantLock.lock();
System.out.println(String.format("\t\t\t\t 线程[%s] 执行 ...", Thread.currentThread().getName()));
reentrantLock.unlock();
}
}
public static void main(String[] args) {
final MyService myService = new MyService();
Runnable runnable = () -> {
System.out.println(String.format("线程[%s] 进入 ...", Thread.currentThread().getName()));
myService.doSome();
};
Thread[] threadArray = new Thread[10];
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(runnable);
thread.setName("Thread_" + i);
threadArray[i] = thread;
}
Arrays.stream(threadArray).forEach(Thread::start);
try {
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出的结果:
image.pngEND
网友评论