公平锁与非公平锁
锁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()启动的线程不代表先获得锁。