并发编程 线程安全——Lock

lock

概述:

本质上Lock仅仅是一个接口
Lock有三个实现类

  • ReentrantLock:表示重入锁 它是唯一一个实现了Lock接口的类
    重入锁指的是线程在获得锁之后 再次获取该锁不需要阻塞 而是直接关联一次计数器增加重入次数
  • ReentrantReadWriteLock:重入读写锁 它实现了ReadWriteLock接口
    在这个类中维护了两个锁
    • ReadLock:读锁
    • WriteLock:写锁

示例:

Lock l = ...; //根据不同的实现Lock接口类的构造函数得到一个锁对象
l.lock(); //获取锁位于try块的外面
try {
// 代码块
} finally {
l.unlock(); // 推荐把锁放到finally中 这样不管怎样都会被释放
}

接口方法:

//尝试获取锁,获取成功则返回,否则阻塞当前线程
void lock();
//尝试获取锁,线程在成功获取锁之前被中断,则放弃获取锁,抛出异常
void lockInterruptibly() throws InterruptedException;
//尝试获取锁,获取锁成功则返回true,否则返回false
boolean tryLock();
//尝试获取锁,若在规定时间内获取到锁,则返回true,否则返回false,未获取锁之前被中断,则抛出异常
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//释放锁
void unlock();
//返回当前锁的条件变量,通过条件变量可以实现类似notify和wait的功能,一个锁可以有多个条件变量
Condition newCondition();

推荐文章:一文带你理解 Java 中 Lock 的实现原理

posted @   熏晴微穗  阅读(76)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示