开发者
资源
【鲲鹏训练营】鲲鹏常用性能调优手段:JAVA调优 实操分享
【鲲鹏训练营】鲲鹏常用性能调优手段:JAVA调优 实操分享
新人帖
发表于2025/06/10
1520

锁竞争调优实践

1.关闭防火墙及SELinux(临时)

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

2.下载安装Devkit工具

cd /home

yum install tar java-devel -y

wget https://kunpeng-repo.obs.cn-north-4.myhuaweicloud.com/Kunpeng%20DevKit/Kunpeng%20DevKit%2025.0.0/DevKit-All-25.0.0-Linux-Kunpeng.tar.gz

tar -zvxf DevKit-All-25.0.0-Linux-Kunpeng.tar.gz

 cd DevKit-All-25.0.0-Linux-Kunpeng/

 ./install.sh

默认按回车,选择输 y

安装完成后,会出现 https://xx.xx.xx.xx:8086的相关提示。

3.Devkit工具登录初始化

电脑浏览器输入上面网址,选择“高级”,“继续前往”,即可进入Devkit登录界面,首次登录需要创建密码,输入密码后即可登录成功。

4.选择“调优”-->“Java性能分析”-->“添加目标环境”,输入用户名及密码,点击确定即可创建目标环境

5.在服务器创建文件

cd  /home

vi lock.java  

按 i 输入以下内容:

public class Lock {

    private static Lock lock = new Lock();

    public static void main(String[] args) throws Exception {

        Thread t = new Thread(new Runnable(){

@Override

public void run(){

synchronized (lock){

try{

Thread.sleep(10000000L);

}catch(Exception e){

e.printStackTrace();

}

}

}

});

t.start();

for(int i=0;i<50;i++){

new Thread(new Runnable(){

@Override

public void run(){

synchronized (lock){

    System.out.println("等");

}

}

}).start();

}

    }

}

按wq!报存退出

6.编译并执行

javac Lock.java   #生成Lock.class文件

java Lock            #执行

7.在线分析

a. 点击步骤4创建的目标环境,即可看到Java进程列表

b. 点击Lock 在线分析,往下拉可以看到线程状态有50个阻塞

c. 点击 “概览” 旁边的 “CPU” 标签,执行线程转储

d. 点击线程转储页签,状态栏筛选BLOCKED

e. 查看线程详情

可见在Lock.java 的23行有个run函数阻塞住了

f .优化代码:

使用ReentrantLock替代synchronized;添加tryLock超时机制 ;采用线程池管理资源;确保锁必然释放;添加线程中断处理。执行时会显示各线程获锁状态。

cd /home 

vi OptimizedLock.java

按 i 添加以下内容

import java.util.concurrent.*;

import java.util.concurrent.locks.*;

public class OptimizedLock {

    private static final ReentrantLock lock = new ReentrantLock();

    private static final ExecutorService pool = Executors.newFixedThreadPool(10);

    public static void main(String[] args) {

        // 长期持有锁的线程(模拟业务处理)

        pool.execute(() -> {

            if (acquireLock(5000)) {

                try {

                    System.out.println("主线程获锁");

                    TimeUnit.SECONDS.sleep(5); // 模拟业务处理

                } catch (InterruptedException e) {

                    Thread.currentThread().interrupt();

                } finally {

                    lock.unlock();

                    System.out.println("主线程释放锁");

                }

            }

        });

        // 并发请求线程

        for (int i = 0; i < 50; i++) {

            final int id = i;

            pool.execute(() -> {

                if (acquireLock(1000)) {

                    try {

                        System.out.println("线程" + id + "执行任务");

                    } finally {

                        lock.unlock();

                    }

                } else {

                    System.out.println("线程" + id + "获取锁超时");

                }

            });

        }

        pool.shutdown();

    }

    private static boolean acquireLock(long timeoutMs) {

        try {

            return lock.tryLock(timeoutMs, TimeUnit.MILLISECONDS);

        } catch (InterruptedException e) {

            Thread.currentThread().interrupt();

            return false;

        }

    }

}

按 wq!报存退出

g . 编译执行

javac OptimizedLock.java

java   OptimizedLock

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞