Java并发包中的重入锁java.util.concurrent.locks.ReentrantLock,可以完全代替synchronized关键字。
自从java1.6后,synchronized关键字的性能与重入锁的性能相差无几。
lock.lock();
lock.lock();
try{
i++;
}finally{
// 释放锁的次数一定要与获得锁的次数相同,否则会抛出
// IllegalMonitorStateException异常
lock.unLock();
lock.unLock();
}
public void run(){
try{
//业务逻辑
lock.lockInterruptibly();
//业务逻辑
}catch(InterruptedException e){
e.printStackTrace();
}finally{
if(lock.isHeldByCurrentThread())
lock.unlock();
}
}
public void run(){
try{
if(lock.tryLock(5,TimeUnit.SECONDS)){
Thread.sleep(6000);
}else{
System.out.println("Get lock failed!");
}
}catch(InterruptedException e){
e.printStackTrace();
}finally{
if(lock.isHeldByCurrentThread()){
lock.unLock();
}
}
}
public static ReentrantLock fairLock = new ReentrantLock(true);
public void run(){
while(true){
try{
fairLock.lock();
//业务逻辑
}finally{
fairLock.unLock();
}
}
}