在Java中,锁是实现并发控制的重要手段。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是非重入锁的实现。
总之,重入锁和非重入锁是实现并发控制的两种方式,根据具体的使用场景选择合适的锁实现非常重要。