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 revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:thread_memory_model [2017/03/18 14:35]
gthanos [Το μοντέλο μνήμης της Java]
java:thread_memory_model [2018/03/07 13:24]
gthanos [Στατικές μεταβλητές της κλάσης]
Line 21: Line 21:
 ===== Το μοντέλο μνήμης των μεταβλητών ===== ===== Το μοντέλο μνήμης των μεταβλητών =====
  
-==== Μεταβλητές ως παράμετροι συναρτήσεων ====+==== Μεταβλητές ως παράμετροι μεθόδων ====
  
-=== Βασικοί τύποι δεδομένων ως παράμετροι συναρτήσεων ===+=== Βασικοί τύποι δεδομένων ως παράμετροι μεθόδων ===
  
-Κάθε τοπική μεταβλητή αποθηκεύεται στο stack. Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μήκος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, έχουμε τις μεταβλητές //a, b, c//. Και οι τρεις μεταβλητές είναι τοπικές δημιουργούνται στην στοίβα του νήματος και καταστρέφονται μετά από την εκτέλεση της μεθόδου //add// Κανένα άλλο νήμα δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές βασικού τύπου.+Κάθε τοπική μεταβλητή αποθηκεύεται στη στοίβα (//stack//). Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μέγεθος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, έχουμε τις μεταβλητές //a, b, c//. Και οι τρεις μεταβλητές είναι τοπικές δημιουργούνται στην στοίβα του νήματος και καταστρέφονται μετά από την εκτέλεση της μεθόδου //add// Κανένα άλλο νήμα δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές βασικού τύπου.
 <code java> <code java>
   int add(int a, int b) {   int add(int a, int b) {
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>
java/thread_memory_model.txt · Last modified: 2018/03/08 09:31 by gthanos