| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
java:thread_memory_model [2017/03/20 06:32] gthanos [Μεταβλητές ως παράμετροι συναρτήσεων] |
java:thread_memory_model [2018/03/08 09:31] (current) gthanos [Στατικές μεταβλητές της κλάσης] |
| ===== Το μοντέλο μνήμης των μεταβλητών ===== | ===== Το μοντέλο μνήμης των μεταβλητών ===== |
| |
| ==== Μεταβλητές ως παράμετροι συναρτήσεων ==== | ==== Μεταβλητές ως παράμετροι μεθόδων ==== |
| |
| === Βασικοί τύποι δεδομένων ως παράμετροι συναρτήσεων === | === Βασικοί τύποι δεδομένων ως παράμετροι μεθόδων === |
| |
| Κάθε τοπική μεταβλητή αποθηκεύεται στη στοίβα (//stack//). Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μέγεθος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, έχουμε τις μεταβλητές //a, b, c//. Και οι τρεις μεταβλητές είναι τοπικές δημιουργούνται στην στοίβα του νήματος και καταστρέφονται μετά από την εκτέλεση της μεθόδου //add//. Κανένα άλλο νήμα δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές βασικού τύπου. | Κάθε τοπική μεταβλητή αποθηκεύεται στη στοίβα (//stack//). Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μέγεθος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, έχουμε τις μεταβλητές //a, b, c//. Και οι τρεις μεταβλητές είναι τοπικές δημιουργούνται στην στοίβα του νήματος και καταστρέφονται μετά από την εκτέλεση της μεθόδου //add//. Κανένα άλλο νήμα δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές βασικού τύπου. |
| </code> | </code> |
| |
| === Αναφορικοί τύποι δεδομένων ως παράμετροι συναρτήσεων === | === Αναφορικοί τύποι δεδομένων ως παράμετροι μεθόδων === |
| |
| Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, τότε η τοπική μεταβλητή παρέχει μία αναφορά προς το αντικείμενο αυτό. Η τοπική μεταβλητή είναι αποθηκευμένη στο //stack//, αλλά το αντικείμενο στο οποίο δείχνει η μεταβλητή είναι αποθηκευμένο στο //heap//. Στο παρακάτω παράδειγμα, οι μεταβλητές //a, b, sum, referenceSum// είναι τοπικές. Οι //a, b, referenceSum// όμως δείχνουν σε αντικείμενα τύπου //Integer// τα οποία είναι αποθηκευμένα στο Heap. Η ζωή των αντικειμένων αυτών εξαρτάται από το κατά πόσο εξακολουθούν να υπάρχουν αναφορές προς αυτά από τοπικές μεταβλητές ή πεδία αντικειμένων ή στατικές μεταβλητές. | Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, τότε η τοπική μεταβλητή παρέχει μία αναφορά προς το αντικείμενο αυτό. Η τοπική μεταβλητή είναι αποθηκευμένη στο //stack//, αλλά το αντικείμενο στο οποίο δείχνει η μεταβλητή είναι αποθηκευμένο στο //heap//. Στο παρακάτω παράδειγμα, οι μεταβλητές //a, b, sum, referenceSum// είναι τοπικές. Οι //a, b, referenceSum// όμως δείχνουν σε αντικείμενα τύπου //Integer// τα οποία είναι αποθηκευμένα στο Heap. Η ζωή των αντικειμένων αυτών εξαρτάται από το κατά πόσο εξακολουθούν να υπάρχουν αναφορές προς αυτά από τοπικές μεταβλητές ή πεδία αντικειμένων ή στατικές μεταβλητές. |
| 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> |
| {{ :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. |
| - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap. | - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap. |
| </WRAP> | </WRAP> |
| | |
| | |Προηγούμενο: [[:java:synchronization | Προβλήματα συγχρονισμού κατά την χρήση διαμοιραζόμενων πόρων ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:synchronized_methods_blocks| Συγχρονισμένες μέθοδοι και blocks ]]| |
| | |