在Java中,鎖是實現并發(fā)控制的重要手段。Java中的鎖主要可分為兩種:重入鎖和非重入鎖。
所謂重入鎖,顧名思義,就是可以重復獲取的鎖。即當一個線程獲取了該鎖之后,可以再次獲取。在Java中,ReentrantLock就是一個典型的重入鎖實現。下面是重入鎖的使用示例:
public class ReentrantLockDemo { private static final ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new Thread(new Runnable() { public void run() { lock.lock(); System.out.println(Thread.currentThread().getName() + " get the lock."); //再次獲取鎖,不會阻塞 lock.lock(); System.out.println(Thread.currentThread().getName() + " get the lock again."); lock.unlock(); lock.unlock(); } }).start(); } }
上述代碼中,當線程獲取鎖之后,再次調用lock方法獲取鎖不會被阻塞,這就是重入鎖的特點。
而非重入鎖則不允許同一線程重復獲取鎖。在Java中,Synchronized就是一種非重入鎖的實現。下面是非重入鎖的使用示例:
public class SynchronizedDemo { public static void main(String[] args) { synchronized (SynchronizedDemo.class) { System.out.println(Thread.currentThread().getName() + " get the lock."); //再次獲取鎖,會被阻塞 synchronized (SynchronizedDemo.class) { System.out.println(Thread.currentThread().getName() + " get the lock again."); } } } }
上述代碼中,當線程已經獲取了鎖之后再次調用synchronized關鍵字獲取鎖,會被阻塞,因為Synchronized是非重入鎖的實現。
總之,重入鎖和非重入鎖是實現并發(fā)控制的兩種方式,根據具體的使用場景選擇合適的鎖實現非常重要。