锁的面试相关


重入锁
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 ReentrantLock(轻量级)等等 ) 。这些已经写好提供的锁为我们开发提供了便利。
重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁 的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁
读写锁
相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注也就是说读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。Java5在java.util.concurrent包中已经包含了读写锁。
static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

锁的类型
在Java中,锁主要用于实现线程同步,以确保多线程环境下对共享资源的安全访问。Java中的锁可以分为以下几种类型
-
内置锁(Intrinsic Locks/Synchronized Locks)
- 同步代码块使用
synchronized关键字修饰的代码块,它使用对象本身作为锁。 - 同步方法使用
synchronized关键字修饰的方法,如果是实例方法,使用对象实例作为锁;如果是静态方法,使用类的Class对象作为锁。
- 同步代码块使用
-
重入锁(Reentrant Lock)
- 是
java.util.concurrent.locks包中提供的一种显式锁,需要手动获取和释放锁。 - 提供了比内置锁更丰富的操作,如尝试非阻塞获取锁(
tryLock)、可中断获取锁(lockInterruptibly)和支持超时的获取锁(tryLock(long timeout, TimeUnit unit))等。
- 是
-
读写锁(Read-Write Lock)
- 也是
java.util.concurrent.locks包中提供的锁,具体实现为ReentrantReadWriteLock。 - 分为读锁(
ReadLock)和写锁(WriteLock),允许多个线程同时读取,但写入时需要独占访问。
- 也是
-
条件锁(Condition Locks)
- 与
ReentrantLock配合使用,通过ReentrantLock的newCondition
- 与