ReentrantLock 重入鎖 可以實現 sync ,比sync靈活,需要手動釋放鎖
new ReentrantLock();//隨機分配鎖
new ReentrantLock(true);//聲明公平鎖 等待時間越長,得到鎖的優先級越高
lock.lock();//申請
lock.unlock();
bool lockFlag = lock.tryLock();//嘗試去拿鎖,返回lock,如果爲true,說明拿到鎖,需要解鎖
bool lockFlag = lock.tryLock(5, TimeUnit.MINUTES);//嘗試去拿鎖,等待5分鐘
lock.lockInterruptibly(); 可被打斷的等待鎖,主線程調用此線程的 interrupt 方法。
/**
* 鎖的使用很簡單
* 1:申請鎖 / 鎖定代碼
* 2:釋放鎖
可以代替synchronize
*/
public class ReentrantLockTest {
Lock lock = new ReentrantLock();//重入鎖
void m1(){
try {
System.out.println("申請鎖 111");
lock.lock();//相當於 synchronized(this)
System.out.println("得到鎖 111");
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("釋放鎖 111");
lock.unlock();
}
}
void m2(){
try {
System.out.println("申請鎖 222");
lock.lock();//相當於 synchronized(this)
System.out.println("得到鎖 222");
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("釋放鎖 222");
lock.unlock();
}
}
public static void main(String[] args) {
ReentrantLockTest test = new ReentrantLockTest();
new Thread(test::m1).start();
new Thread(test::m2).start();
}
}
運行結果:
申請鎖 111
得到鎖 111
申請鎖 222
釋放鎖 111
得到鎖 222
釋放鎖 222