如何手写JDK锁
手写JDK锁
需要三个步骤:
-
手写一个类MyLock,实现Lock接口
-
重写lock()方法
-
重写unlock()方法
代码:
public class MyLock implements Lock {
//线程的原子操作类
AtomicReference<Thread> owner = new AtomicReference<>();
//如果有的线程抢不到,就放入等待队列
public LinkedBlockingQueue<Thread> waiters = new LinkedBlockingQueue<>();
@Override
public void lock() {
//多个线程同时调用
while (!owner.compareAndSet(null, Thread.currentThread())) {//如果不成功
waiters.add(Thread.currentThread());//加入等待队列
//Thread.currentThread().wait();//不能使用,wait()方法需要synchronized关键字
LockSupport.park();//让当前线程等待
//取巧的方式:如果能执行到本行的话,说明这个线程被唤醒了,可以从等待队列中删除了
waiters.remove(Thread.currentThread());
}
}
@Override
public void unlock() {
//多个线程同时解锁
if (owner.compareAndSet(Thread.currentThread(), null)) {//判断当前线程是不是owner
//释放锁
Object[] objects = waiters.toArray();//等待队列转化为数组
for (Object object : objects) {//唤醒等待队列中所有的线程
Thread thread = (Thread) object;
LockSupport.unpark(thread);
}
}
}
@Override
public void lockInterruptibly() throws InterruptedException {
// TODO Auto-generated method stub
}
@Override
public boolean tryLock() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
// TODO Auto-generated method stub
return false;
}
@Override
public Condition newCondition() {
// TODO Auto-generated method stub
return null;
}
}
测试
启动10个线程,每个线程执行10000次incr()操作。
public class TestMyLock {
int i = 0;
int j = 0;
Lock lock = new MyLock();
public void incr() {
lock.lock();
try {
i++;
j++;
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
TestMyLock demo = new TestMyLock();
for (int k = 0; k < 10; k++) {
new Thread(() -> {
for (int i = 0; i < 10000; i++) {
demo.incr();
}
}).start();
}
Thread.sleep(1000);
System.out.println(demo.i);
System.out.println(demo.j);
}
}
执行结果:
由于博主也是在攀登的路上,文中可能存在不当之处,欢迎各位多指教! 如果文章对您有用,那么请点个”推荐“,以资鼓励!
欢迎各位加我主页weixin,备注“博客园”,进入技术交流群,和我一起讨论和交流,共同进步!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具