没有合适的资源?快使用搜索试试~ 我知道了~
多线程(11)ReentrantLock公平锁与非公平锁(修改)1
需积分: 0 0 下载量 131 浏览量
2022-08-03
23:01:22
上传
评论
收藏 174KB PDF 举报
温馨提示
试读
7页
private static class MyReentrantLock extends ReentrantLock {public MyReentrantLo
资源详情
资源评论
资源推荐
一一: ReentrantLock公平锁原理公平锁原理
这里前面介绍了sychronized这个关键字,这里除了这个关键字外,其实还有另外一个ReentrantLock方法,这个相对于前者来说,其实功能更加丰富,而且
特点之一就是可以实现公平性。其实这里的公平性,本质就是在竞争的时候,如果非公平锁则会在lock的时候,先去竞争锁,如果竞争失败了则放进到同步
队列当中。而公平锁则是在lock的时候,就直接放进同步队列里面,不去竞争,按照进来的先后顺序去获取锁了。
package ReentrantLock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class FairAndUnfairTest {
/*CountDownLatch一个同步辅助类,在jdk5中引入,
* 它允许一个或多个线程等待其他线程操作完成之后才执行。
能够使一个或多个线程等待其他线程完成各自的工作后再执行*/
private static CountDownLatch start;
private static class MyReentrantLock extends ReentrantLock {
public MyReentrantLock(boolean fair) {
super(fair); //是否开启公平锁
}
public Collection<Thread> getQueuedThreads() {
List<Thread> arrayList = new ArrayList<Thread>(super.getQueuedThreads());
Collections.reverse(arrayList);
return arrayList;
}
}
private static class Worker extends Thread {
private Lock lock;
public Worker(Lock lock) { this.lock = lock;}
@Override
public void run() {
try {
start.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 连续两次打印当前的Thread和等待队列中的Thread
//for (int i = 0; i < 2; i++) {
lock.lock(); //加锁
try {
System.out.println("Lock by [" + getName() + "], Waiting by "
+ ((MyReentrantLock) lock).getQueuedThreads());
} finally {
System.out.println(getName()+" is unlock ");
lock.unlock();
//slowly();
}
//}
}
public String toString() {
return getName();
}
}
public static void main(String[] args) {
Lock fairLock = new MyReentrantLock(true);
Lock unfairLock = new MyReentrantLock(false);
//testLock(fairLock); //开启公平性
testLock(unfairLock); //
}
private static void testLock(Lock lock) {
start = new CountDownLatch(1); //计数器加1
for (int i = 0; i < 10; i++) { //启动五个线程
刘璐璐璐璐璐
- 粉丝: 31
- 资源: 326
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0