重入鎖的學習 (ReentrantLock)

重入鎖  :(ReentrantLock)

  • 上鎖 用reentrantLock.lock 方法 解鎖 用reentrantLock.unlock 方法
  • 上鎖和解鎖 必須配對 能夠多重上鎖
  • ReentrantLock 是對 synchronized 的升級,synchronized 底層是經過 JVM 實現的,
  • ReentrantLock 是經過 JDK 實現的,使⽤起來更加簡單。
  • 重⼊鎖是指能夠給同⼀個資源添加過個鎖,而且解鎖的⽅式與 synchronized 有區別,
  • synchronized 的鎖是線程執⾏完畢以後⾃動釋放,ReentrantLock 的鎖是經過開發者⼿動釋放的。
import java.util.concurrent.locks.ReentrantLock;

public class Account implements Runnable {
    private static int num;
    private ReentrantLock reentrantLock = new ReentrantLock();

    @Override
    public void run() {
//上鎖
        reentrantLock.lock();
        reentrantLock.lock();
        num++;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("您是第" + num + "位訪客");
//解鎖
        reentrantLock.unlock();
        reentrantLock.unlock();
    }
}

 

public class Test {
    public static void main(String[] args) {
        Account account = new Account();
        new Thread(account).start();
        new Thread(account).start();
    }
}

 

  • 重⼊鎖可中斷,是指某個線程在等待獲取鎖的過程當中能夠主動終⽌線程,lockInterruptibly()。
  • 重⼊鎖具有限時性的特色,能夠判斷某個線程在⼀定的時間內可否獲取鎖。
  • boolean tryLock(long time,TimeUnit unit) time:時間數值 unit:時間單位
  • true 表示在該時段內可以獲取鎖,false 表示在該時段內⽆法獲取鎖。
  • 當判斷的時間小於休眠的時間時不能獲取鎖 不然能夠
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class TimeOut implements Runnable {
    private ReentrantLock reentrantLock = new ReentrantLock();

    @Override
    public void run() {
        try {
            if (reentrantLock.tryLock(6, TimeUnit.SECONDS)) {
                System.out.println(Thread.currentThread().getName() + "get lock");
                Thread.sleep(5000);
            } else {
                System.out.println(Thread.currentThread().getName() + "not lock");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        reentrantLock.unlock();
    }
}

 

public class Test01 {
    public static void main(String[] args) {
        TimeOut timeOut = new TimeOut();
        new Thread(timeOut,"線程1").start();
        new Thread(timeOut,"線程2").start();
    }
}

相關文章
相關標籤/搜索