User Tools

Site Tools


java:thread_memory_model

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:thread_memory_model [2017/03/20 06:32] – [Μεταβλητές ως παράμετροι συναρτήσεων] gthanosjava:thread_memory_model [2018/03/08 09:31] (current) – [Στατικές μεταβλητές της κλάσης] gthanos
Line 21: Line 21:
 ===== Το μοντέλο μνήμης των μεταβλητών ===== ===== Το μοντέλο μνήμης των μεταβλητών =====
  
-==== Μεταβλητές ως παράμετροι συναρτήσεων ====+==== Μεταβλητές ως παράμετροι μεθόδων ====
  
-=== Βασικοί τύποι δεδομένων ως παράμετροι συναρτήσεων ===+=== Βασικοί τύποι δεδομένων ως παράμετροι μεθόδων ===
  
 Κάθε τοπική μεταβλητή αποθηκεύεται στη στοίβα (//stack//). Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μέγεθος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, έχουμε τις μεταβλητές //a, b, c//. Και οι τρεις μεταβλητές είναι τοπικές δημιουργούνται στην στοίβα του νήματος και καταστρέφονται μετά από την εκτέλεση της μεθόδου //add// Κανένα άλλο νήμα δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές βασικού τύπου. Κάθε τοπική μεταβλητή αποθηκεύεται στη στοίβα (//stack//). Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μέγεθος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, έχουμε τις μεταβλητές //a, b, c//. Και οι τρεις μεταβλητές είναι τοπικές δημιουργούνται στην στοίβα του νήματος και καταστρέφονται μετά από την εκτέλεση της μεθόδου //add// Κανένα άλλο νήμα δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές βασικού τύπου.
Line 33: Line 33:
 </code> </code>
  
-=== Αναφορικοί τύποι δεδομένων ως παράμετροι συναρτήσεων ===+=== Αναφορικοί τύποι δεδομένων ως παράμετροι μεθόδων ===
  
 Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, τότε η τοπική μεταβλητή παρέχει μία αναφορά προς το αντικείμενο αυτό. Η τοπική μεταβλητή είναι αποθηκευμένη στο //stack//, αλλά το αντικείμενο στο οποίο δείχνει η μεταβλητή είναι αποθηκευμένο στο //heap//. Στο παρακάτω παράδειγμα, οι μεταβλητές //a, b, sum, referenceSum// είναι τοπικές. Οι //a, b, referenceSum// όμως δείχνουν σε αντικείμενα τύπου //Integer// τα οποία είναι αποθηκευμένα στο Heap. Η ζωή των αντικειμένων αυτών εξαρτάται από το κατά πόσο εξακολουθούν να υπάρχουν αναφορές προς αυτά από τοπικές μεταβλητές ή πεδία αντικειμένων ή στατικές μεταβλητές. Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, τότε η τοπική μεταβλητή παρέχει μία αναφορά προς το αντικείμενο αυτό. Η τοπική μεταβλητή είναι αποθηκευμένη στο //stack//, αλλά το αντικείμενο στο οποίο δείχνει η μεταβλητή είναι αποθηκευμένο στο //heap//. Στο παρακάτω παράδειγμα, οι μεταβλητές //a, b, sum, referenceSum// είναι τοπικές. Οι //a, b, referenceSum// όμως δείχνουν σε αντικείμενα τύπου //Integer// τα οποία είναι αποθηκευμένα στο Heap. Η ζωή των αντικειμένων αυτών εξαρτάται από το κατά πόσο εξακολουθούν να υπάρχουν αναφορές προς αυτά από τοπικές μεταβλητές ή πεδία αντικειμένων ή στατικές μεταβλητές.
Line 77: Line 77:
 class SharedObj { class SharedObj {
  
-  public Integer object2 = new Integer(22); +  public Integer object = new Integer(22); 
-  public Integer object4 new Integer(44);+  public long member 12345;
  
-  public long member1 = 12345; 
-  public long member2 = 67890; 
 } }
 </code> </code>
Line 118: Line 116:
 {{  :java:java-memory-model3.png?500  }} {{  :java:java-memory-model3.png?500  }}
  
-Στο παρακάτω σχηματικό διάγραμμα δίνεται σχηματικά η εκτέλεση του παραπάνω κώδικα.+Στο παραπάνω διάγραμμα δίνεται σχηματικά η εκτέλεση του παραπάνω κώδικα.
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-== Συμπερασματικά ==+=== Συμπερασματικά ===
   - Μία τοπική μεταβλητή βασικού τύπου (int, long, byte, double etc) αποθηκεύεται στο stack.   - Μία τοπική μεταβλητή βασικού τύπου (int, long, byte, double etc) αποθηκεύεται στο stack.
   - Μία τοπική μεταβλητή ενός αναφορικού τόπου αποθηκεύει την αναφορά στο stack, αλλά το αντικείμενο στο heap.   - Μία τοπική μεταβλητή ενός αναφορικού τόπου αποθηκεύει την αναφορά στο stack, αλλά το αντικείμενο στο heap.
Line 127: Line 125:
   - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap.   - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap.
 </WRAP> </WRAP>
 +
 +|Προηγούμενο: [[:java:synchronization | Προβλήματα συγχρονισμού κατά την χρήση διαμοιραζόμενων πόρων  ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:synchronized_methods_blocks| Συγχρονισμένες μέθοδοι και blocks ]]|
 +
java/thread_memory_model.1489991528.txt.gz · Last modified: 2017/03/20 06:32 by gthanos