This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:thread_memory_model [2017/03/18 10:51] gthanos [Το μοντέλο μνήμης για τους αναφορικούς τύπους δεδομένων] |
java:thread_memory_model [2018/03/08 09:31] gthanos [Στατικές μεταβλητές της κλάσης] |
||
|---|---|---|---|
| Line 17: | Line 17: | ||
| Το μοντέλο μνήμης στην Java δίνεται από το παρακάτω σχήμα. Κάθε νήμα διαθέτει την δική του στοίβα (stack), όπου αποθηκεύονται οι τιμές των τοπικών μεταβλητών. Κάθε νήμα έχει πρόσβαση αποκλειστικά στην δική του στοίβα, | Το μοντέλο μνήμης στην Java δίνεται από το παρακάτω σχήμα. Κάθε νήμα διαθέτει την δική του στοίβα (stack), όπου αποθηκεύονται οι τιμές των τοπικών μεταβλητών. Κάθε νήμα έχει πρόσβαση αποκλειστικά στην δική του στοίβα, | ||
| - | {{:java:java-memory-model-1.png?400 | }} Το διπλανό | + | {{ :java:thread_stack_heap.png?400 | Το σχήμα αποτυπώνει το βασικό μοντέλο μνήμης. Διακρίνονται το stack όπου αποθηκεύονται οι τοπικές μεταβλητές των μεθόδων που εκτελούνται από κάθε νήμα και το Heap που αποθηκεύονται τα αντικείμενα που δημιουργούνται από όλα τα νήματα. |
| - | Εάν μία | + | ===== Το μοντέλο μνήμης των μεταβλητών ===== |
| - | Επίσης, | + | ==== Μεταβλητές |
| + | === Βασικοί τύποι δεδομένων ως παράμετροι μεθόδων === | ||
| - | ===== Τοπικές Μεταβλητές ===== | + | Κάθε τοπική μεταβλητή αποθηκεύεται |
| - | + | ||
| - | === Το μοντέλο μνήμης για τους βασικούς τύπους δεδομένων === | + | |
| - | + | ||
| - | Κάθε τοπική μεταβλητή αποθηκεύεται στο stack. Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μήκος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, | + | |
| <code java> | <code java> | ||
| int add(int a, int b) { | int add(int a, int b) { | ||
| Line 36: | Line 33: | ||
| </ | </ | ||
| + | === Αναφορικοί τύποι δεδομένων ως παράμετροι μεθόδων === | ||
| - | === Το μοντέλο μνήμης | + | Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, |
| - | Όταν δημιουργείται ένα αντικείμενο το οποίο | + | <WRAP tip 80% center round> |
| + | Αντικείμενα που είναι αποθηκευμένα στο //heap// είναι | ||
| + | </ | ||
| <code java> | <code java> | ||
| Line 49: | Line 49: | ||
| </ | </ | ||
| - | Συμπερασματικά: | ||
| - | - Μία τοπική μεταβλητή βασικού τύπου (int, long, byte, double etc) αποθηκεύεται στο stack | ||
| - | - Μία τοπική μεταβλητή ενός αναφορικού τόπου αποθηκεύει την αναφορά στο stack, αλλά το αντικείμενο στο heap. | ||
| - | - Κάθε μέθοδος ενός αντικειμένου (που είναι αποθηκευμένο στο stack), εφόσον έχει τοπικές μεταβλητές αυτές αποθηκεύονται στο stack (ισχύουν τα παραπάνω για βασικούς και αναφορικούς τύπους). | ||
| - | - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap. | ||
| - | ===== Ένα πιο σύνθετο παράδειγμα ===== | + | ==== Μεταβλητές ως πεδία |
| - | {{ : | + | Κάθε κλάση που υλοποιεί ένα νήμα (// |
| - | Στο παραπάνω σχηματικό διάγραμμα δίνονται | + | Αντίθετα, μεταβλητές |
| + | |||
| + | <code java BasicThread.java> | ||
| + | public class BasicThread extends Thread { | ||
| + | |||
| + | SharedObj shared; | ||
| + | public BasicThread(SharedObj obj) { shared = obj; } | ||
| + | |||
| + | public void run() { | ||
| + | int localInt = 45; | ||
| + | Integer localInteger = new Integer(58); | ||
| + | shared.member++; | ||
| + | } | ||
| + | |||
| + | public static void main(String []args) { | ||
| + | SharedObj obj = new SharedObj(); | ||
| + | new BasicThread(obj).start(); | ||
| + | new BasicThread(obj).start(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class SharedObj { | ||
| + | |||
| + | public Integer object = new Integer(22); | ||
| + | public long member = 12345; | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | Παρακάτω δίνεται η σχηματική αναπαράσταση | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ===== Στατικές μεταβλητές της κλάσης ===== | ||
| + | |||
| + | Στο παρακάτω κώδικα | ||
| <code java MyThread.java> | <code java MyThread.java> | ||
| Line 66: | Line 96: | ||
| public void run() { | public void run() { | ||
| int localInt = 45; | int localInt = 45; | ||
| - | | + | |
| + | localObj.member++; | ||
| } | } | ||
| | | ||
| Line 75: | Line 106: | ||
| } | } | ||
| - | class MySharedObject | + | class SharedObj |
| - | public static | + | public static |
| - | + | public Integer | |
| - | public Integer | + | public long member |
| - | public Integer object4 = new Integer(44); | + | |
| - | + | ||
| - | public long member1 | + | |
| - | public long member2 = 67890; | + | |
| } | } | ||
| </ | </ | ||
| + | {{ : | ||
| + | |||
| + | Στο παραπάνω διάγραμμα δίνεται σχηματικά η εκτέλεση του παραπάνω κώδικα. | ||
| + | |||
| + | <WRAP tip 80% center round> | ||
| + | === Συμπερασματικά === | ||
| + | - Μία τοπική μεταβλητή βασικού τύπου (int, long, byte, double etc) αποθηκεύεται στο stack. | ||
| + | - Μία τοπική μεταβλητή ενός αναφορικού τόπου αποθηκεύει την αναφορά στο stack, αλλά το αντικείμενο στο heap. | ||
| + | - Οποιοδήποτε πεδίο της κλάσης ενός νήματος αποθηκεύεται στο heap μαζί με το αντικείμενο. Όλα τα πεδία | ||
| + | - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap. | ||
| + | </ | ||
| + | |||
| + | |Προηγούμενο: | ||