1??????????ReentrantLock??????synchronized?飬???????????????????

(1) ??????

???????????????

Lock lock = new ReentrantLock();
????????????????????????????У?????????

void lock();
?????

void unlock();
????????lock()

boolean tryLock();

(2) ????????

locker.lock();
try{
//code here to access the cirtical section
}finally{
locker.unlock();
}
???????????????κ????????????????????????????????????????????????????κ?????????lock?????????????????????????????????????????try???????????????????finally block??????locker??

(3) ???????????

???????????????????????????????????е????????????????????м???(hold count)??????lock???????????á????????ε???lock???????unlock???????????????????????????????????????????????????????????????

(4) ???????

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
class WorkerOne extends Thread{
    private Lock locker;
    public WorkerOne (Lock locker){
        this.locker = locker;
    }
    
    public void run(){
        locker.lock();
        try{
System.out.println(Thread.currentThread().getName()+":step into critical section");
        }finally{
            locker.unlock();    
        }
    }
}
 
class WorkerTwo extends Thread{
    private Lock locker;
    public WorkerTwo (Lock locker){
        this.locker = locker;
    }
    
    public void sayHello(){
        locker.lock();
        try{    System.out.println(Thread.currentThread().getName()+":call sayHello()");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            locker.unlock();
        }
    }
    
    public void run(){
        locker.lock();  
        try{        System.out.println(Thread.currentThread().getName()+":setp into critical section");
                        //??????????????? 
            sayHello();
        }finally{
            locker.unlock();    
        }
    }
}
 
public class Test5 {
    public static void main(String[] args) {
        Lock locker = new ReentrantLock();
        WorkerOne wo= new WorkerOne(locker);
        wo.setName("WorkerOne");
        WorkerTwo wt = new WorkerTwo(locker);
        wt.setName("WorkerTwo");
        
        wt.start();
        wo.start(); 
    }
}