java:thread_memory_model
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:thread_memory_model [2017/03/18 13:00] – [Ένα πιο σύνθετο παράδειγμα] gthanos | java:thread_memory_model [2018/03/08 09:31] (current) – [Στατικές μεταβλητές της κλάσης] 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, όμως το αντικείμενο στο οποίο δείχνει αποθηκεύεται στο heap. | + | |
- | + | ||
- | Επίσης, | + | |
===== Το μοντέλο μνήμης των μεταβλητών ===== | ===== Το μοντέλο μνήμης των μεταβλητών ===== | ||
- | ==== Μεταβλητές ως παράμετροι | + | ==== Μεταβλητές ως παράμετροι |
- | === Βασικοί τύποι δεδομένων === | + | === Βασικοί τύποι δεδομένων ως παράμετροι μεθόδων === |
- | Κάθε τοπική μεταβλητή αποθηκεύεται στο stack. Για τις τοπικές μεταβλητές βασικού τύπου (//int, byte, long, double//) που γνωρίζουμε εκ των προτέρων το μήκος τους αυτές αποθηκεύονται στη στοίβα. Στο παρακάτω παράδειγμα, | + | Κάθε τοπική μεταβλητή αποθηκεύεται |
<code java> | <code java> | ||
int add(int a, int b) { | int add(int a, int b) { | ||
Line 38: | Line 33: | ||
</ | </ | ||
- | === Αναφορικούς τύπους δεδομένων === | + | === Αναφορικοί τύποι δεδομένων ως παράμετροι μεθόδων === |
- | Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, | + | Όταν δημιουργείται ένα αντικείμενο το οποίο ανατίθεται σε μία τοπική μεταβλητή ενός νήματος, |
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Αντικείμενα που είναι αποθηκευμένα στο //heap// είναι δυνατόν να διαμοιράζονται με άλλα νήματα ανεξάρτητα από την τοπικότητα ή μη των μεταβλητών που δείχνουν σε αυτά. | ||
+ | </ | ||
<code java> | <code java> | ||
Line 50: | Line 49: | ||
</ | </ | ||
- | ==== Μεταβλητές ως πεδία της κλάσης που υλοποιεί το νήμα ==== | ||
- | Κάθε κλάση που υλοποιεί ένα νήμα (implements Runnable ή extends Thread) μπορεί να έχει πεδία βασικού ή αναφορικού τύπου. Οι μεταβλητές | + | ==== Μεταβλητές |
- | Αντίθετα, οι μεταβλητές που είναι αναφορικού τύπου παρά το γεγονός ότι είναι διαφορετικές για κάθε νήμα είναι δυνατόν να δείχνουν σε αντικείμενα που είναι κοινά με άλλα νήματα. Δείτε το παρακάτω παράδειγμα κώδικα, | + | Κάθε κλάση που υλοποιεί ένα νήμα (// |
+ | |||
+ | Αντίθετα, | ||
<code java BasicThread.java> | <code java BasicThread.java> | ||
Line 60: | Line 60: | ||
| | ||
SharedObj shared; | SharedObj shared; | ||
- | public BasicThread(SharedObj obj;) { shared = obj; } | + | public BasicThread(SharedObj obj) { shared = obj; } |
public void run() { | public void run() { | ||
Line 77: | Line 77: | ||
class SharedObj { | class SharedObj { | ||
- | public Integer | + | public Integer |
- | public | + | public |
- | public long member1 = 12345; | ||
- | public long member2 = 67890; | ||
} | } | ||
</ | </ | ||
Line 87: | Line 85: | ||
Παρακάτω δίνεται η σχηματική αναπαράσταση εκτέλεσης των δύο νημάτων της κλάσης // | Παρακάτω δίνεται η σχηματική αναπαράσταση εκτέλεσης των δύο νημάτων της κλάσης // | ||
- | {{ : | + | {{ : |
- | + | ||
- | + | ||
- | Συμπερασματικά: | + | |
- | - Μία τοπική μεταβλητή βασικού τύπου (int, long, byte, double etc) αποθηκεύεται στο stack | + | |
- | - Μία τοπική μεταβλητή ενός αναφορικού τόπου αποθηκεύει την αναφορά στο stack, αλλά το αντικείμενο στο heap. | + | |
- | - Κάθε μέθοδος ενός αντικειμένου (που είναι αποθηκευμένο στο stack), εφόσον έχει τοπικές μεταβλητές αυτές αποθηκεύονται στο stack (ισχύουν τα παραπάνω για βασικούς και αναφορικούς τύπους). | + | |
- | - Οι στατικές μεταβλητές ανήκουν στις κλάσεις τις οποίες ορίζονται κατά συνέπεια είναι αποθηκευμένες πάντοτε στο heap. | + | |
===== Στατικές μεταβλητές της κλάσης ===== | ===== Στατικές μεταβλητές της κλάσης ===== | ||
- | Στο παρακάτω κώδικα δύο νήματα διαμοιράζονται μία τοπική μεταβλητή | + | Στο παρακάτω κώδικα δύο νήματα |
<code java MyThread.java> | <code java MyThread.java> | ||
Line 105: | Line 96: | ||
public void run() { | public void run() { | ||
int localInt = 45; | int localInt = 45; | ||
- | | + | |
+ | localObj.member++; | ||
} | } | ||
| | ||
Line 114: | Line 106: | ||
} | } | ||
- | class MySharedClass | + | 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. | ||
+ | </ | ||
+ | |||
+ | |Προηγούμενο: | ||
- | Στο παρακάτω σχηματικό διάγραμμα δίνεται σχηματικά η εκτέλεση του παραπάνω κώδικα, |
java/thread_memory_model.1489842018.txt.gz · Last modified: 2017/03/18 13:00 by gthanos