简述一下Synchronized和ReentrantLock
时间: 2023-06-05 14:04:35 浏览: 105
Synchronized是Java中最基本的同步机制,它是Java语言内置的一种同步锁机制。它是非公平锁,并且只支持可重入锁。在同步代码块或同步方法执行时,会自动获取对象锁或当前类的锁,并在同步块执行完毕后自动释放锁。
ReentrantLock是Java中的一个可重入锁实现类,它比Synchronized更灵活、更强大,也更具扩展性、可重入性和公平性。ReentrantLock是一种公平锁,并且可以选择性地实现公平锁或非公平锁。与Synchronized不同的是,ReentrantLock在使用时必须手动获取锁和释放锁,在使用上比较麻烦。另外,它可以支持多个条件变量,也可以在锁的基础上实现公平队列等高级功能。
相关问题
简述synchronized和lock原理的区别
synchronized 和 lock 都是 Java 中用于实现线程同步的机制,它们的作用都是保证在同一时刻只有一个线程能够访问共享资源。它们的原理有一些不同。
synchronized 是 Java 语言中的关键字,它是在 JVM 层面上实现的。它的机制是,每个 Java 对象都有一个监视器锁(monitor),当一个线程访问该对象的 synchronized 代码块时,会尝试获取该对象的监视器锁,如果获取到锁,则表示该线程可以进入 synchronized 代码块执行,其他线程则必须等待。当 synchronized 代码块执行完毕时,该线程会释放锁,其他线程则可以尝试获取锁并进入 synchronized 代码块执行。
lock 是 Java 5 中引入的一个接口,它提供了比 synchronized 更加灵活和强大的线程同步机制。lock 接口的实现类可以实现不同的锁定策略,比如可重入锁、公平锁、读写锁等。lock 接口中最常用的实现类是 ReentrantLock。lock 的机制是,一个线程在访问共享资源前,必须先获取锁,如果获取不到锁,则该线程会被阻塞,直到获取到锁才能进入临界区访问共享资源。当线程访问完共享资源后,必须释放锁,其他线程才能获取锁访问共享资源。
总的来说,synchronized 是 Java 的内置机制,使用起来比较简单,但是锁定的粒度比较大,只能锁定整个对象,不能灵活控制锁定范围。而 lock 则是一个接口,使用起来比较灵活,可以实现不同的锁定策略,但是也比较复杂,需要手动加锁和解锁。
阅读全文