在Lock对象加锁时,存在两种获取锁的机制,一种是按照线程排队等锁的顺序来获取,一种是随机获取锁,前者叫公平锁,后者叫非公平锁。公平锁的实现是内部维护了一个队列,因此效率上会比非公平锁低5-10倍。
资源共享类:
package com.lenovo.plm.dms.p16;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private Lock lock;
public Service(boolean isFair){
lock = new ReentrantLock(isFair);
}
public void service(){
lock.lock();
System.out.println(Thread.currentThread().getName() + " is running");
lock.unlock();
}
}
线程类:
package com.lenovo.plm.dms.p16;
public class MyThread extends Thread {
private Service service;
public MyThread(Service service){
this.service = service;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
System.out.println(Thread.currentThread().getName() + " begin to run...");
service.service();
}
}
运行类如下:
package com.lenovo.plm.dms.p16;
public class Main {
public static void main(String[] args) {
Service service = new Service(false);
MyThread[] t = new MyThread[10];
for(int i=0;i<10;i++){
t[i] = new MyThread(service);
}
for(int i=0;i<10;i++){
t[i].start();
}
}
}
运行结果如下:
Thread-1 begin to run...
Thread-5 begin to run...
Thread-4 begin to run...
Thread-7 begin to run...
Thread-2 begin to run...
Thread-3 begin to run...
Thread-0 begin to run...
Thread-6 begin to run...
Thread-1 is running
Thread-8 begin to run...
Thread-9 begin to run...
Thread-8 is running
Thread-4 is running
Thread-5 is running
Thread-7 is running
Thread-2 is running
Thread-3 is running
Thread-0 is running
Thread-6 is running
Thread-9 is running
线程在等锁和获取锁的顺序是一样的,因此这是一个公平锁,如果将上述ReentrackLock构造函数传入false,则就是一个非公平锁。