java:deadlock

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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();
     ​     ​
   }   }
java/deadlock.txt · Last modified: 2016/02/26 11:15 (external edit)