公平锁:
公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的。
示例代码:
import java.util.concurrent.locks.ReentrantLock;
import java.lang.Thread;
class MyService{
private ReentrantLock lock;
public MyService(boolean isFair){
super();
lock=new ReentrantLock(isFair);
}
public void serviceMethod(){
try{
lock.lock();
System.out.println("ThreadName="+Thread.currentThread().getName()+"获取锁定");
}finally{
lock.unlock();
}
}
}
public class RunFair{
public static void main(String[]args){
final MyService myservice=new MyService(true);
Runnable runnable=new Runnable(){
@Override
public void run(){
System.out.println("线程"+Thread.currentThread().getName()+"运行了");
myservice.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的线程先获得锁。
非公平锁:
一种获得锁的抢占机制,是随机获得锁的,和公平锁不一样的地方就是先来的不一定先得到锁,这个方式可能到时某些进程一直拿不到锁,结果也就不公平了。
示例代码:
修改一行代码
final MyService myservice=new MyService(false);
运行结果:
结果分析:
此时的结果基本是乱序的,先start的线程不一定先获得锁。