当前位置:网站首页>Concurrent programming - deadlock troubleshooting and handling
Concurrent programming - deadlock troubleshooting and handling
2022-07-05 07:05:00 【Handling Gong】
Preface
I believe many programmers have encountered deadlock in their work , For example, database deadlock 、 Application deadlock . So how do we deal with this situation ? This paper will sort out the relevant ideas and solutions through a simple case , I hope it can help children's shoes in similar situations .
1. What is a deadlock ?
A deadlock is when two or more threads are executing , One caused by competition for resources The phenomenon of waiting for each other , If there is no external force to interfere, they will not be able to push forward , If system resources are sufficient , Process resource requests can be satisfied , The possibility of deadlock is very low , Otherwise, we will be locked in a deadlock due to competing for limited resources .
The main cause of deadlock :
① Insufficient system resources ;
② The recommended sequence of process operation is out of time ;
③ Misallocation of resources ;
2. Handwriting a deadlock case Case study
Above we know what a deadlock is and the conditions under which it occurs , Then let's experience deadlock by writing a case :
public static void main(String[] args) {
final Object objectA = new Object();
final Object objectB = new Object();
new Thread(() -> {
synchronized (objectA) {
System.out.println(" Threads " + Thread.currentThread().getName() + " start-up , hold A lock ...");
try {
TimeUnit.SECONDS.sleep(1L);
synchronized (objectB) {
System.out.println(" Threads " + Thread.currentThread().getName() + " Try to get B lock , success !!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(() -> {
synchronized (objectB) {
System.out.println(" Threads " + Thread.currentThread().getName() + " start-up , hold B lock ...");
try {
TimeUnit.SECONDS.sleep(1L);
synchronized (objectA) {
System.out.println(" Threads " + Thread.currentThread().getName() + " Try to get A lock , success !!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
}
You can see , Two threads compete for resources , Causes deadlock , The program is running all the time , Can't end .
3. Deadlock detection
By handwriting deadlock case, Know that there is a deadlock , Then the real production environment cannot locate whether there is a deadlock , For example, I wrote a while(true) {} Infinite loop a block of code .
3.1 Command line troubleshooting
How to locate the deadlock ? It's simple , Use JDK The order that comes with you - jstack Check it out. JVM Stack information for :
① jps - See what's running Java process ;
② jstack process ID;
Through the output information, you can see , Deadlock detected , It also points out the specific number of code lines that cause deadlock .
3.2 Graphical interface troubleshooting
There is another way to troubleshoot deadlocks , It's also JDK A graphical command provided jconsole, Through this command, you can connect to specific Java process , View it graphically .
Two ways , Can locate the location where the deadlock occurs . After positioning , Optimize the program to avoid deadlock ( Avoid the cause of deadlock ).
above , It is the two simplest and most practical methods for checking deadlocks , Encounter program jam in real production environment 、 When there is no response , This way can be used to check whether the deadlock is caused by the non release of a large amount of resources .
边栏推荐
- Mutual transformation between two-dimensional array and sparse array (sparse matrix)
- Error: "mountvolume.setup failed for volume PVC fault handling
- 摄像头的MIPI接口、DVP接口和CSI接口
- Orin installs CUDA environment
- Written examination notes
- Ret2xx---- common CTF template proposition in PWN
- [OBS] x264 Code: "buffer_size“
- SD_CMD_RECEIVE_SHIFT_REGISTER
- vim
- 扫盲-以太网MII接口类型大全-MII、RMII、SMII、GMII、RGMII、SGMII、XGMII、XAUI、RXAUI
猜你喜欢
随机推荐
Dameng database all
Build a microservice cluster environment locally and learn to deploy automatically
Volcano 资源预留特性
Docker installs MySQL and uses Navicat to connect
网易To B,柔外刚中
Ros2 - workspace (V)
Positive height system
MySQL (UDF authorization)
SD_CMD_RECEIVE_SHIFT_REGISTER
Ros2 - ros2 vs. ros1 (II)
Error: "mountvolume.setup failed for volume PVC fault handling
About vscode, "code unreachable" will be displayed when calling sendline series functions with pwntools“
【无标题】
Vscode editor
Architecture
Unity 之 ExecuteAlways正在取代ExecuteInEditMode
Page type
testing framework
Utf8 encoding
NVM Downloading npm version 6.7.0... Error