java:deadlock

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Αδιέξοδο στην χρήση των πόρων και πως να το αποφύγετε ====== Ένα αδιέξοδο στην χρήση των πόρων συμβαίνει όταν δύο νήματα A, B μπλοκάρονται επιχειρώντας τα κλειδώσουν ταυτόχρονα τα ίδια locks με αντίστροφη σειρά. Ας υποθέσουμε ότι το νήμα Α κλειδώνει το lockA και περιμένει να κλειδώσει και το lockB. Αντίστροφά το νήμα Β κλειδώνει το lockB και περιμένει να κλειδώσει και το lockA. Σε αυτή την περίπτωση, το νήμα Α περιμένει την ελευθέρωση του πόρου από το νήμα Β και το νήμα Β περιμένει την ελευθέρωση του πόρου από το νήμα Α. Αν κανένας πόρος δεν ελεθερώνεται τότε τα νήματα παραμένουν μπλοκαρισμένα. Δείτε το παρακάτω παράδειγμα κώδικα που παρουσιάζει την κατάσταση που περιγράφεται παραπάνω. <code java TreeNode.java> import java.util.*; public class TreeNode { String name = null; TreeNode parent = null; List<TreeNode> children = new ArrayList<>(); public TreeNode(String name) { this.name = name; } public synchronized void addChild(TreeNode child){ if(!this.children.contains(child)) { this.children.add(child); System.out.println("Hi! Locked parent and attemping to lock child."); child.setParentOnly(this); System.out.println("Hi! Locked child as well."); } } public synchronized void addChildOnly(TreeNode child){ if(!this.children.contains(child)){ this.children.add(child); } } public synchronized void setParent(TreeNode parent){ this.parent = parent; System.out.println("Hi! Locked child and attemping to lock parent."); parent.addChildOnly(this); System.out.println("Hi! Locked parent as well."); } public synchronized void setParentOnly(TreeNode parent){ this.parent = parent; } public static void main(String args[]) { final TreeNode child = new TreeNode("child"); final TreeNode parent = new TreeNode("parent"); new Thread(new Runnable() { public void run() { child.setParent(parent); } }).start(); new Thread(new Runnable() { public void run() { parent.addChild(child); } }).start(); } } </code>

java/deadlock.1427693301.txt.gz · Last modified: 2016/02/26 11:15 (external edit)