首页 > 编程语言 >LockSupport底层源码分析(二)

LockSupport底层源码分析(二)

时间:2025-01-01 13:02:24浏览次数:3  
标签:Thread blocker Object 写入 LockSupport 源码 线程 内存 底层

目录

blocker对象分析

基本作用

内存屏障效果

写入过程

实际应用

其他线程可见性 

诊断和监控


blocker对象分析

public class LockSupport {
    public static void park(Object blocker) {
        // 1. 设置blocker
        Thread t = Thread.currentThread();
        setBlocker(t, blocker);
        
        // 2. 执行park操作
        U.park(false, 0L);
        
        // 3. 清除blocker
        setBlocker(t, null);
    }
}

         再park方法里会执行setBlocker方法,再执行park方法,那这个setBlocker方法到底有什么用呢?

private static void setBlocker(Thread t, Object arg) {
        U.putReferenceOpaque(t, PARKBLOCKER, arg);
}
基本作用

     这个方法的主要作用是设置线程对象的parkBlocker字段,用于记录线程被谁阻塞。

     在park方法需要传入一个对象,一般都会传入this对象,在park方法里会将这个this对象设置到Thread类的parkBlocker对象里,可用来监控和诊断,可以通过线程对象的parkBlocker对象判断该线程是由什么造成的一个阻塞。

内存写入:将一个对象引用(arg)写入到线程对象(t)的特定内存偏移位(PARKBLOCKER),这是一个直接操作内存的操作,绕过了Java的访问控制

Opaque语义:"Opaque"表示这是一个有序的写入操作,不会与其他内存操作重排序,保证写入的可见性

// 伪代码展示内存屏障效果
void putReferenceOpaque(Object o, long offset, Object value) {
    // StoreStore屏障
    // 确保之前的写操作都已完成
    storeStoreBarrier();
    
    // 写入内存
    putReference(o, offset, value);
    
    // StoreLoad屏障
    // 确保写入对其他线程可见
    storeLoadBarrier();
}
内存屏障效果
// 伪代码展示内存屏障效果
void putReferenceOpaque(Object o, long offset, Object value) {
    // StoreStore屏障
    // 确保之前的写操作都已完成
    storeStoreBarrier();
    
    // 写入内存
    putReference(o, offset, value);
    
    // StoreLoad屏障
    // 确保写入对其他线程可见
    storeLoadBarrier();
}

可见性保证:写入操作对其他线程立即可见,不会被CPU缓存影响,直接写入主内存

顺序性保证:写入操作不会与之前的写操作重排序,写入操作不会与之后的读操作重排序,维护程序的顺序性语义

class Thread {
    // ... 其他字段
    
    // parkBlocker字段,用于存储导致线程阻塞的对象
    private volatile Object parkBlocker;
    
    // ... 其他字段
}

       parkBlocker对象会保存在线程里面,看看下面我写的引用代码实现。

写入过程
// Unsafe的操作过程
public class Unsafe {
    // PARKBLOCKER是parkBlocker字段在Thread类中的内存偏移量
    private static final long PARKBLOCKER = ...;
    
    public void putReferenceOpaque(Object o, long offset, Object value) {
        // 1. o是Thread对象的内存起始地址
        // 2. offset是parkBlocker字段相对于对象起始位置的偏移量
        // 3. value是要存储的对象引用
        
        // 直接将value写入到 o + offset 的内存位置
    }
}
实际应用
// AQS中的使用示例
public abstract class AbstractQueuedSynchronizer {
    public final void acquire(int arg) {
        if (!tryAcquire(arg)) {
            // 将当前线程封装成节点
            Node node = addWaiter(Node.EXCLUSIVE);
            // 进入等待队列
            acquireQueued(node, arg);
        }
    }
    
    final boolean acquireQueued(final Node node, int arg) {
        try {
            boolean interrupted = false;
            for (;;) {
                final Node p = node.predecessor();
                if (p == head && tryAcquire(arg)) {
                    setHead(node);
                    p.next = null;
                    return interrupted;
                }
                if (shouldParkAfterFailedAcquire(p, node) &&
                    parkAndCheckInterrupt()) {
                    interrupted = true;
                }
            }
        } catch (RuntimeException ex) {
            cancelAcquire(node);
            throw ex;
        }
    }
    
    private final boolean parkAndCheckInterrupt() {
        // 使用当前的AQS对象作为blocker
        LockSupport.park(this);
        return Thread.interrupted();
    }
}
其他线程可见性 
// 其他线程可以立即看到写入的值
Thread t1 = new Thread(() -> {
    Object blocker = new Object();
    LockSupport.park(blocker);
});

Thread t2 = new Thread(() -> {
    // 可以立即看到t1的blocker对象
    Object b = LockSupport.getBlocker(t1);
});
诊断和监控
public class ThreadMonitor {
    public void monitorThreads() {
        Thread[] threads = getAllThreads();
        for (Thread t : threads) {
            Object blocker = LockSupport.getBlocker(t);
            if (blocker != null) {
                if (blocker instanceof AbstractQueuedSynchronizer) {
                    // 线程在等待AQS锁
                    AbstractQueuedSynchronizer aqs = (AbstractQueuedSynchronizer)blocker;
                    System.out.println("线程 " + t.getName() + 
                        " 正在等待锁 " + aqs);
                    
                } else if (blocker instanceof ReentrantLock) {
                    // 线程在等待ReentrantLock
                    System.out.println("线程 " + t.getName() + 
                        " 正在等待ReentrantLock");
                    
                } else if (blocker instanceof Condition) {
                    // 线程在等待Condition
                    System.out.println("线程 " + t.getName() + 
                        " 正在等待Condition");
                }
            }
        }
    }
}

标签:Thread,blocker,Object,写入,LockSupport,源码,线程,内存,底层
From: https://blog.csdn.net/xweiran/article/details/144849587

相关文章

  • springboot527基于Java企业项目管理系统(论文+源码)_kaic
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统企业项目管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个企业项......
  • springboot526基于Java的大学生考勤系统的设计与实现(论文+源码)_kaic
    摘  要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理......
  • 【Java项目】基于SpringBoot+Vue的宠物救助及领养平台的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/90001525基于SpringBoot+Vue的宠物救助及领养平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven宠物救助及领养平台是一个专注于宠物保护和幸福的在线平台。它致力于......
  • 【开题报告+文档+源码】基于Python心理健康管理系统
    项目背景与意义在21世纪的快速发展下,社会变革日益加剧,人们的生活节奏逐渐加快,竞争也日益激烈。与此同时,人与人之间的关系变得错综复杂,社会已进入了信息时代。由于科学技术日新月异,知识更新加快,迫使人们需要不断学习才不至于被飞速发展的社会淘汰。在这样的社会现实下,人们的观......
  • 【开题报告+文档+源码】基于Django的在线音乐网站
    项目背景随着互联网的发展和智能设备的普及,人们对于音乐的需求越来越大。传统的音乐播放器已经无法满足人们多样化的需求,因此开发一个在线音乐推荐与播放平台具有重要的研究背景和实际意义。传统的音乐播放器只提供基本的音乐播放功能,无法根据用户的个性化需求进行音乐推荐。......
  • Flink源码解析之:如何根据JobGraph生成ExecutionGraph
    Flink源码解析之:如何根据JobGraph生成ExecutionGraph在上一篇Flink源码解析中,我们介绍了Flink如何根据StreamGraph生成JobGraph的流程,并着重分析了其算子链的合并过程和JobGraph的构造流程。对于StreamGraph和JobGraph的生成来说,其都是在客户端生成的,本文将会讲述JobGraph......
  • 【源码解读】25年跨年 一起来放个烟花吧
    跨年烟花前端代码分析最近我研究了一个跨年烟花的前端项目,代码非常有趣且复杂。通过分析这个项目,我学到了很多关于前端动画、Canvas渲染、物理模拟以及状态管理的知识。以下是我对这个项目的详细分析。项目预览地址》》源代码传送门》》跨年烟花项目概述这个项......
  • ssm校园设备巡检管理系统04b46程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着教育技术的快速发展,校园内的各类教学设备日益增多,其运行状况直接关系到教学质量。为确保设备正常运行,及时发现并处理潜在问题,我们......
  • ssm校园快递管理系统a64pd--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着电子商务的迅猛发展,校园快递业务量逐年攀升。然而,传统的快递管理方式存在效率低下、管理混乱等问题,无法满足广大师生的需求......
  • ssm校园书蜀黍易购平台xk9g6(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着校园规模的不断扩大,学生对于书籍的需求日益多样化,传统的购书方式已难以满足学生的需求。校园内二手书交易虽然活跃,但缺乏规范的管......