1.lock
锁提供对共享资源的独占访问,同一时刻,只能用一个线程获得锁
import java.util.concurrent.locks.ReentrantLock;
public class D23 {
public static void main(String[] args) {
T t = new T();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class T implements Runnable{
int num = 10;
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while(true){
lock.lock();
try {
if(num<=0){
return;
}else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + " get ticket " + num--);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
}
}
格式为:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
//并发代码
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
lock.unlock(); //无论如何,最后一定要unlock
}
2.ReentrantLock 可重入的互斥锁


3.lock 与 synchronized 对比
| lock | synchronized |
| 显式锁,手动开启和释放 | 隐式锁,出了作用域自动释放 |
| 接口,有实现类 | 关键字 |
| 只有代码块锁 | 有代码块锁和方法锁 |
| 更灵活,有可扩展的子类 | |
| 所需调度时间更少,性能更好 |
文章介绍了Java中的ReentrantLock锁,它是可重入的互斥锁,提供了比synchronized更细粒度的控制。使用ReentrantLock需要手动获取和释放锁,但在异常处理中更灵活,可以避免死锁。相比于synchronized,ReentrantLock在某些情况下能提供更好的性能和更多的功能,如公平锁和尝试锁。
9万+

被折叠的 条评论
为什么被折叠?



