This shows you the differences between two versions of the page.
Next revision | Previous revision Next revision Both sides next revision | ||
java:deadlock [2015/03/30 04:37] gthanos created |
java:deadlock [2015/03/30 05:28] gthanos |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Αδιέξοδο στην χρήση των πόρων και πως να το αποφύγετε ====== | ====== Αδιέξοδο στην χρήση των πόρων και πως να το αποφύγετε ====== | ||
- | Δείτε τον παρακάτω κώδικα | + | Ένα αδιέξοδο στην χρήση των πόρων συμβαίνει όταν δύο νήματα A, B μπλοκάρονται επιχειρώντας τα κλειδώσουν ταυτόχρονα τα ίδια locks με αντίστροφη σειρά. Ας υποθέσουμε ότι το νήμα Α κλειδώνει το lockA και περιμένει να κλειδώσει και το lockB. Αντίστροφά το νήμα Β κλειδώνει το lockB και περιμένει να κλειδώσει και το lockA. Σε αυτή την περίπτωση, το νήμα Α περιμένει την ελευθέρωση του πόρου από το νήμα Β και το νήμα Β περιμένει την ελευθέρωση του πόρου από το νήμα Α. Αν κανένας πόρος δεν ελεθερώνεται τότε τα νήματα παραμένουν μπλοκαρισμένα. Δείτε το παρακάτω παράδειγμα κώδικα που παρουσιάζει την κατάσταση που περιγράφεται παραπάνω. |
<code java TreeNode.java> | <code java TreeNode.java> | ||
+ | import java.util.*; | ||
+ | |||
public class TreeNode { | public class TreeNode { | ||
- | TreeNode parent = null; | + | String name = null; |
- | List children = new ArrayList(); | + | TreeNode parent = null; |
+ | List<TreeNode> children = new ArrayList<>(); | ||
+ | |||
+ | public TreeNode(String name) { | ||
+ | this.name = name; | ||
+ | } | ||
public synchronized void addChild(TreeNode child){ | public synchronized void addChild(TreeNode child){ | ||
if(!this.children.contains(child)) { | if(!this.children.contains(child)) { | ||
this.children.add(child); | this.children.add(child); | ||
+ | System.out.println("Hi! Locked parent and attemping to lock child."); | ||
child.setParentOnly(this); | child.setParentOnly(this); | ||
+ | System.out.println("Hi! Locked child as well."); | ||
} | } | ||
} | } | ||
| | ||
public synchronized void addChildOnly(TreeNode child){ | public synchronized void addChildOnly(TreeNode child){ | ||
- | if(!this.children.contains(child){ | + | if(!this.children.contains(child)){ |
this.children.add(child); | this.children.add(child); | ||
} | } | ||
Line 23: | Line 33: | ||
public synchronized void setParent(TreeNode parent){ | public synchronized void setParent(TreeNode parent){ | ||
this.parent = parent; | this.parent = parent; | ||
+ | System.out.println("Hi! Locked child and attemping to lock parent."); | ||
parent.addChildOnly(this); | parent.addChildOnly(this); | ||
+ | System.out.println("Hi! Locked parent as well."); | ||
} | } | ||
Line 31: | Line 43: | ||
| | ||
public static void main(String args[]) { | 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(); | ||
| | ||
} | } |