ReentrantLock同步代码块
synchronized加锁和解锁都是自动进行的,不必担心锁是否已经释放,而ReentrantLock需要手动来创建和释放锁,并且ReentrantLock实现了一个公平锁的机制。 ReentrantLock和synchronized主要功能都是用作与同步代码块。应用场景例如生产者消费者模型使用ReentrantLock+Condtion。
运用ReentRantLock来同步代码块:
import java.util.concurrent.locks.*;
public class TestTicketRunnable{
public static void main(String[] a){
TicketThread tThread = new TicketThread();
new Thread(tThread).start();
new Thread(tThread).start();
new Thread(tThread).start();
}
}
class TicketThread implements Runnable {
private int ticket = 5;
private static Lock lock=new ReentrantLock();
public void run(){
for (int i = 0; i < 5; i++){
lock.lock();
if (ticket > 0){
try {
Thread.sleep(300);
System.out.println(Thread.currentThread().getName()+"得到了锁");
ticket--;
System.out.println("剩下的票数"+ticket);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
System.out.println(Thread.currentThread().getName()+"释放了锁");
}
}
}
}
}
输出结果:
Thread-0得到了锁
剩下的票数4
Thread-0释放了锁
Thread-1得到了锁
剩下的票数3
Thread-1释放了锁
Thread-1得到了锁
剩下的票数2
Thread-1释放了锁
Thread-1得到了锁
剩下的票数1
Thread-1释放了锁
Thread-1得到了锁
剩下的票数0
Thread-1释放了锁