当前位置:网站首页>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 .

 

原网站

版权声明
本文为[Handling Gong]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050639414015.html