首先分析下Lock与synchronized异同点:
主要相同点:Lock 能完成 synchronized 所实现的所有功能
主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,并且必须在 finally 代码块中释放。Lock 还有更强大的功能,例如,它的 tryLock 方法可以非阻塞方式去拿锁。
public class LockTest {
private int j;
private Lock lock = new ReentrantLock();
public static void main(String[] args) {
LockTest test = new LockTest();
for(int i=0;i<2;i++){
new Thread(test.new LockThread()).start();
}
}
private class LockThread implements Runnable {
public void run() {
while (true) {
/*
* synchronized (ThreadTest.this) {
* System.out.println("j--=" +j--); //这里抛异常了,锁不能释放
* }
*/
lock.lock();
try {
System.out.println("j--=" + j--);
} finally {
lock.unlock(); //lock是手动释放锁
}
}
}
}
} |