이중 자물쇠
나사는 사용하기가 매우 간단하고 이해하기 쉽기 때문에 많은 응용 프로그램이있는 매우 유용한 도구입니다. 그러나 동시에, 그것은 또한 약간의 어려움, 즉 교착 상태를 유발할 수 있습니다. 교착 상태가 발생하면 시스템 기능을 사용할 수 없습니다. 먼저 코드를 살펴 보겠습니다.이 코드는 교착 상태를 유발하여 Thread Thread_1 및 Thread Thread_2가 서로 잠금을 해제하기를 기다릴 수 있습니다.
패키지 스레드; public class deadlockdemo {private static string a = "a"; private static string b = "b"; public static void main (public static void main ()) {new Deadlockdemo (). Deadlock ();} 개인 void Deadlock () {// Thread Thread_1 Thread Throok () {System.err.println ( "-Thread_1 잠금 a ----"); 동기화 (b) {system.err.println ( "-스레드 _1 잠금 b ----");}}}); // 스레드 스레드 스레드 (Thread_2 Thread_2 스레드 스레드 _2 = 새 스레드) {System.out.println ( "-Thread_2 Lock B -----"); Synchronized (a) {System.out.println ( "-Thread_2 Lock a ----");}}}); thread_1.start (); thread_2.start ();}}}이 코드는 교착 상태 시나리오의 데모 일 뿐이며 실제로는 그러한 코드를 작성하지 않을 수 있습니다. 그러나 몇 가지 복잡한 시나리오에서는 일부 비정상적인 상황 (죽은 루프)이므로 Thread_1과 같은 문제가 발생하지 않을 수 있습니다. 또는 Thread_1은 데이터베이스 케이블을 가져오고 잠금을 풀면 예외가 발생하지만 해제되지는 않습니다.
교착 상태가 발생하면 서비스를 제공 할 수 없기 때문에 사업은 인식 할 수 있습니다. 그런 다음 덤프 스레드를 통해 어떤 스레드가 문제가 있는지 확인할 수 있습니다. 다음 스레드 정보에 따르면 교착 상태에서 35 및 21 행이 교착 상태를 일으켰습니다.
"Thread -1"PRIO = 6 TID = 0x000000000000CB13800 NID = 0x19AC 모니터 입력 대기 [0 X000000000D67F000] java.lang.thread.state : thread.deadlockdemo $ 2.Run (Deadlockdemo.java:35) - 잠금으로 기다려야합니다. java.lang.string) - 잠금 <0x00000007d5a9beb8> (java.lang.lang.lang.thread.run (알 수없는 소스) "스레드 -0"prio = 6 tid = 0x00000000000000cb0e800 nid = 0x6bc 모니터 항목 [0x 000000000000000000d48f000] java.lang.thread.state : thread.deadlockdemo $ 1.Run (DeadlockDemo.java:21) - 차단 (객체 모니터) - <0x00000007d5a9beb8> (java.lang.string) - 잠금 <0x00000007d5a9be88> (Java.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang.lang). java.lang.thread.run (알 수없는 소스)
교착 상태를 피하는 몇 가지 일반적인 방법.
스레드와 동시에 여러 자물쇠를 얻지 마십시오.
하나의 스레드가 로프에서 여러 자원을 동시에 차지하는 것을 피하고 각 로프가 하나의 리소스 만 소비하는지 확인하십시오.
내부 검색 메커니즘을 사용하는 대신 Lock.rylock (시간 초과)을 사용하여 시간이 정한 검색을 사용해보십시오.
데이터베이스 케이블의 경우 잠금 및 잠금 해제는 데이터베이스 연결에 있어야합니다. 그렇지 않으면 잠금 해제가 실패합니다.
참조:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
요약
위는이 기사에서 교착 상태를 피하기 위해 Java의 일반적인 방법에 대한 전체 코드 분석입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!