首页>JAVA>正文

【上海Java培训】Java线程公平锁

时间:2018-02-06 15:21:15   来源:上海尚学堂   阅读:
大多数情况下,锁的申请是非公平的,也就意味的,线程1首先请求锁A,接着线程2也请求了锁A,那么锁A可用时,到底是线程1还是线程2可以获得锁,这不一定。系统会从总中随机挑选一个,而公平锁的机制,则是会按照时间的先后顺序保证先到的先得到。


公平锁最大的特点就是不会产生饥饿现象。只要排队都能获取资源。
 
公平锁看起来很完美,但是实现公平锁的则是必须需要系统维护一个有序的队列。因而实现成本较高。性能也相对低下。
在实际的开发过程中,没有什么特殊要求,也不需要使用公平锁。
 
ReentrantLock lock = new ReentrantLock(true);

代码示例: 线程的创建效率
import java.util.concurrent.locks.ReentrantLock;
/**
 *  公平锁与非公平锁
 *  原创:上海尚学堂 shsxt.com
 *  比较两者的执行的速度与效率
 */
public class ReentrantLockDemo01 {
private static final ReentrantLock lock = new ReentrantLock();
private static final ReentrantLock fairlock = new ReentrantLock(true);
private int n;
 
public static void main(String[] args) {
ReentrantLockDemo01 rlt = new ReentrantLockDemo01();
for (int i = 0; i < 100; i++) {
Thread nonT = new Thread(new NonFairTestThread(rlt));
nonT.setName("nonFair[" + (i + 1) + "]");
nonT.start();
Thread fairT = new Thread(new FairTestThread(rlt));
fairT.setName("fair[" + (i + 1) + "]");
fairT.start();
}
}
 
// 非公平锁
static class NonFairTestThread implements Runnable {
private ReentrantLockDemo01 rlt;
 
public NonFairTestThread(ReentrantLockDemo01 rlt) {
this.rlt = rlt;
}
 
public void run() {
lock.lock();
try {
rlt.setNum(rlt.getNum() + 1);
System.out.println(Thread.currentThread().getName() + " nonfairlock***************" + rlt.getNum());
} finally {
lock.unlock();
}
}
}
 
// 公平锁
static class FairTestThread implements Runnable {
private ReentrantLockDemo01 rlt;
 
public FairTestThread(ReentrantLockDemo01 rlt) {
this.rlt = rlt;
 
}
 
public void run() {
fairlock.lock();
try {
rlt.setNum(rlt.getNum() + 1);
System.out.println(Thread.currentThread().getName() + "   fairlock=======" + rlt.getNum() + "   "
+ fairlock.getHoldCount() + " queuelength=" + fairlock.getQueueLength());
} finally {
fairlock.unlock();
}
 
}
}
 
public void setNum(int n) {
this.n = n;
}
 
public int getNum() {
return n;
}
}
 
 上海Java培训感谢您的阅读,转载请注明出处,后续Java相关技术文章陆续奉上,请多关注!
分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫