java 鎖的使用

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

發佈了42 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章