锁竞争调优实践
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

锁竞争调优实践
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