相信很多人都知道在java中存在锁这个东西,他就是为了防止有些数据被多个线程同时访问而导致的一种进制。
需求:要求两个线程间隔着访问同一个数据,或者执行某一段代码
技术点:安全锁
/**
* 参数true表示公平锁,这个ReentrantLock是重入锁,安全锁是冲入锁的一种特例,在构造函数中设置true即表明为安全锁
*/
public static ReentrantLock lock = new ReentrantLock(true);
public static class MyRunable implements Runnable{
@Override
public void run() {
while (true){
try{
lock.lock();
System.out.println(Thread.currentThread().getName()+"----获得锁");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
public static void main(String[] args) {
MyRunable run = new MyRunable();
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
t1.start();
t2.start();
}
打印结果
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
从上面的打印结果来看,两个线程在执行的时候呈现交替执行的情况,当这个线程执行完成后下一个线程抢占资源,很公平
那么肯定有人问,这个是两个线程出现的情况,多个线程是不是也是公平的呢。答案是当然的,四个线程的时候出现以下结果
Thread-0----获得锁
Thread-3----获得锁
Thread-2----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-3----获得锁
Thread-2----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-3----获得锁
Thread-2----获得锁
Thread-1----获得锁