公平锁与非公平锁
2017-07-19 08:48
225 查看
公平锁与非公平锁
锁Lock分为公平锁与非公平锁。公平锁是表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序。而非公平锁就是一种获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定先得到锁,这个方式可能造成某些线程拿不到锁,结果也就是不公平的了。新建Service.java :
package service;
importjava.util.concurrent.locks.ReentrantLock;
public class Service {
privateReentrantLock lock;
publicService(boolean isFair) {
super();
lock= new ReentrantLock(isFair);
}
publicvoid serviceMethod() {
try{
lock.lock();
System.out.println("ThreadName="+ Thread.currentThread().getName()
+"获得锁定");
}finally {
lock.unlock();
}
}
}
新建RunFair.java :
package test.run;
import service.Service;
public class RunFair {
publicstatic void main(String[] args) throws InterruptedException {
finalService service = new Service(true);
Runnablerunnable = new Runnable() {
@Override
publicvoid run() {
System.out.println("★线程" + Thread.currentThread().getName()
+"运行了");
service.serviceMethod();
}
};
Thread[]threadArray = new Thread[10];
for(int i = 0; i < 10; i++) {
threadArray[i]= new Thread(runnable);
}
for(int i = 0; i < 10; i++) {
threadArray[i].start();
}
}
}
运行结果:
打印结果基本是有序的,这就是公平锁的特点。
新建RunNotFair.java:
package test.run;
import service.Service;
public class RunNotFair {
publicstatic void main(String[] args) throws InterruptedException {
finalService service = new Service(false);
Runnablerunnable = new Runnable() {
@Override
publicvoid run() {
System.out.println("★线程" + Thread.currentThread().getName()
+"运行了");
service.serviceMethod();
}
};
Thread[]threadArray = new Thread[10];
for(int i = 0; i < 10; i++) {
threadArray[i]= new Thread(runnable);
}
for(int i = 0; i < 10; i++) {
threadArray[i].start();
}
}
}
运行结果为:
非公平锁的运行结果基本上是乱序的,说明先start()启动的线程不代表先获得锁。
相关文章推荐
- java多线程的公平锁和非公平锁
- ReentrantLock的公平锁与非公平锁浅析
- [多线程_reentrantlock公平锁与非公平锁]
- 公平锁与非公平锁
- 锁的公平与非公平
- 公平锁和非公平锁
- Java多线程公平锁与非公平锁
- 公平锁与非公平锁
- AbstractQueuedSynchronizer源码分析一(独占锁部分,公平非公平)
- 公平锁与非公平锁
- 公平锁和非公平锁
- JAVA多线程-Lock的使用(二)-公平锁与非公平锁
- 公平锁和非公平锁
- java 线程公平锁与非公平锁详解及实例代码
- Reetrantlock的公平非公平原理解析
- Java多线程Lock对象之公平锁和非公平锁
- 公平锁与非公平锁
- Java之ReentrantLock公平锁和非公平锁
- Java中ReentrantLock的公平锁和非公平锁
- java之ReentrantLock公平锁和非公平锁