学习过线程相关知识的朋友都应该已经知道,同步控制对于并发控制的重要性,synchronized关键字是最简单的一种控制方法。它决定了一个线程是否可以访问临界区。而Object类中的wait()和notify()/notifyAll()方法也是一些线程之间通信的工具。但是,当我们想更加灵活的区规定何时加锁,何时释放锁时,synchronized就显得力所不及了。这时我们就引入了一个新的概念—重入锁。
重入锁(ReentrantLock)
他是java并发核心包java.util.concurrent包下的子包java.util.concurrent.locks里面的一个类。下面先简单展示其使用案例:
public class ReentrantLockDemo implements Runnable {
private static ReentrantLock reenterLock = new ReentrantLock();
private static int i = 0;
@Override
public void run() {
for(int j = 0;j<10;j++){
reenterLock.lock();
reenterLock.lock();
try {
i++;
System.out.println(Thread.currentThread().getName()+"正在操作!!!");
}finally {
reenterLock.unlock();
reenterLock.unlock();
}
}
}
public static void main(String[] args) throws InterruptedException {
ReentrantLockDemo r = new ReentrantLockDemo();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(i);
}
}
结果如下:
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-0正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
Thread-1正在操作!!!
20
上述代码中使用了重入锁保护临界资源,可以有我们自己规定何时加锁何时释放锁。记住一旦加了锁,必须要释放,否则以后的线程则再无法获得锁。