看好了,我只表演一次
/**
* 重入锁可以完全替代Synchronized关键字,但其必须显式的调用unlock。
* 建议视为Synchronized的高级版,比起Synchronized关键字,
* 其可定时、可轮询并含有可中断的锁获取操作,公平队列以及非块结构的锁。
*/
public class ReeterLock implements Runnable{
/**
* 重入锁演示
*
*/
public static ReentrantLock lock = new ReentrantLock();
public static int i = 0;
/**
* 那么我们可以明显的看到重入锁保护着临界区资源i,确保多线程对i操作的安全。在demo中我们也是加了3次锁并释放了3次锁。
*
* 需要注意的是,如果同一线程多次获得锁,那么在释放锁的时候,也必须释放相同次数。
* 如果释放的次数多了,会得到一个java.lang.IllegalMonitorStateException异常;
* 反之则会导致当前线程一直持有该锁,导致其他线程无法进入临界区。
*/
@Override
public void run() {
for (int j=0;j<10000;j++){
//手动上锁,可以上N把,这里是为了演示
lock.lock();
lock.lock();
lock.lock();
try {
i ++;
} finally {
//无论如何必须释放锁,上几把 释放几把
lock.unlock();
lock.unlock();
lock.unlock();
}
}
}
public static void main(String[] a) throws InterruptedException {
ReeterLock rl = new ReeterLock();
Thread t1 = new Thread(rl);
Thread t2 = new Thread(rl);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.print(i);
}
}