淘先锋技术网

首页 1 2 3 4 5 6 7

在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是非重入锁的实现。

总之,重入锁和非重入锁是实现并发控制的两种方式,根据具体的使用场景选择合适的锁实现非常重要。