..


Σύνδεσμοι διαφημιζόμενων

Διαχείριση των κοινών δεδομένων σε Java

Το άρθρο γράφτηκε από Damiano Verda
Σελίδα 1 από 2

Μπορούμε να σκεφτούμε ένα κοινό δεδομένα, όπως όλα τα άλλα καθήκοντα επεξεργασίας πληροφοριών που πρέπει να εκτεθεί σε περισσότερα μέρη. Φανταστείτε, για παράδειγμα, αποθηκεύσετε μια αριθμητική τιμή που αντιπροσωπεύει το ευρώ / δολάριο. Έχουμε ένα πρόγραμμα που ελέγχει περιοδικά ό, τι η συναλλαγματική ισοτιμία και ενημερώνει την τιμή της μεταβλητής. Ένα ή περισσότερα άλλα προγράμματα, όμως, θα χρησιμοποιήσει τις ενημερωμένες πληροφορίες για τη λειτουργία της συναλλαγματικής ισοτιμίας τιμή μετατροπής.

Παρατηρήστε πως η διαχείριση ενός κοινού, ακόμη και σε αυτό το απλό παράδειγμα, χρειάζονται ιδιαίτερη προσοχή. Φανταστείτε για παράδειγμα ότι, ενώ η αίτηση πρέπει να διαβάσει τη συναλλαγματική ισοτιμία για τη μετατροπή, είναι επίσης δεκτός από τον άλλο πρόγραμμα, το αίτημα για αλλαγή της συναλλαγματικής ισοτιμίας η ίδια.

Ποια εκτελείται πρώτα; Ποια μετατροπή της συναλλαγματικής ισοτιμίας γίνεται; Το πρόβλημα, ακόμη και σε ορισμένες περιπτώσεις ελαφρώς πιο περίπλοκο, θα μπορούσε να είναι ακόμη πιο σοβαρές.

Φανταστείτε το γεγονός ότι η μεταβλητή ενδιαφέροντος δεν είναι στοιχειώδη, αλλά, για παράδειγμα, αποτελείται από ένα σύνολο δεδομένων. Μπορεί τώρα να γίνει μόνο μερική παραίτηση, και στη συνέχεια ακολουθείται από μια ανάγνωση από την ολοκλήρωση της γραφής. Οι συναλλαγές θα ήταν τότε να γίνεται με ένα σύνολο αξιών αλλάξει μόνο εν μέρει, με αποτέλεσμα να έχει νόημα τα αποτελέσματα και, συνεπώς, απαράδεκτη.

Δεδομένης της ύπαρξης αυτού του είδους των προβλημάτων πολλές γλώσσες προγραμματισμού παρέχουν ειδικά εργαλεία για τη διαχείριση των κοινών μεταβλητών. Εξετάζουμε παρακάτω ιδίως σε ό, αυτή η κατηγορία είναι τα προβλήματα αντιμετωπίζονται με τη γλώσσα προγραμματισμού Java, ένας από τους χρησιμοποιείται περισσότερο από όλα.

Πρώτα πρέπει να κατανοήσουμε πώς μπορούμε να διασφαλίσουμε ότι μόνο ένα πρόγραμμα κάθε φορά, ή, ακριβέστερα, ένα μόνο νήμα κάθε φορά (ένα νήμα είναι το βασικό συστατικό της διαδικασίας ή του προγράμματος, με άλλα λόγια, ένα πρόγραμμα μπορεί να αποτελείται από πολλαπλά threads, τρέχουν ταυτόχρονα) μπορεί να έχει πρόσβαση μια κοινή μεταβλητή. Ο μηχανισμός που μας επιτρέπει να προσφέρουμε αυτή την εγγύηση καλείται αμοιβαίου αποκλεισμού.

Αμοιβαία αποκλεισμού

Φανταστείτε την ανάπτυξη μιας τάξης (ή ενός συνόλου των στοιχείων και των μεθόδων, που είναι χρήσιμες λειτουργίες για την επεξεργασία των ίδιων των δεδομένων) που ονομάζεται Variabile_Condivisa διαρθρώνεται ως εξής:






 δημόσια τάξη Variabile_Condivisa







 {



   



 euro_dollaro float?



   



 euro_sterlina float?





   



 Variabile_Condivisa ()



  



 {



     



 euro_dollaro = 1?



     



 euro_sterlina = 1?



  



 }





   



 set_euro_dollaro κενό (float e_d) = {euro_dollaro e_d?}



   



 set_euro_sterlina κενό (float e_s) = {euro_sterlina e_s?}





   



 get_euro_dollaro float () {επιστροφή euro_dollaro?}



   



 get_euro_sterlina float () {επιστροφή euro_sterlina?}







 }



Οι δύο δηλώσεις, και ότι euro_dollaro euro_sterlina, εκπροσωπώντας της ισοτιμίας του ευρώ / δολαρίου και ευρώ / στερλίνα και ότι θέλουμε να μοιραστούν τις πληροφορίες μεταξύ πολλών προγραμμάτων (ή μεταξύ πολλαπλά threads). Οι μέθοδοι που αναπτύχθηκαν σας επιτρέπουν να ορίσετε μια τιμή σε αυτά τα δεδομένα (και set_euro_dollaro set_euro_sterlina) και να διαβάσετε αυτές τις τιμές (και get_euro_dollaro get_euro_sterlina).

Τότε θα προσδιορίσει μια συγκεκριμένη μέθοδο (Variabile_Condivisa), το οποίο καλείται ο κατασκευαστής τάξη εκτελείται και ότι η δημιουργία του κάθε Variabile_Condivisa, στην περίπτωση αυτή με τον καθορισμό των τιμών των μεταβλητών και euro_dollaro euro_sterlina έχουν οριστεί σε 1.

Στη συνέχεια, δημιουργούμε το πρόγραμμά μας έναν τύπο αντικειμένου που ονομάζεται var Variabile_Condivisa (της τάξης αντιπροσωπεύει ένα σύνολο οντοτήτων με κοινά χαρακτηριστικά, ενώ ένα αντικείμενο που αντιπροσωπεύει ένα συγκεκριμένο στοιχείο αυτής της δέσμης, η οποία μπορεί να γίνει αναφορά στο πλαίσιο του προγράμματος ) με αυτόν τον τρόπο:






 Variabile_Condivisa Variabile_Condivisa var = new ()?



Όπως μπορούμε τώρα να διασφαλίσει ότι δεν υπάρχουν προβλήματα στη διαχείριση των κοινών στοιχείων var; Η γλώσσα Java παρέχει τη λέξη-κλειδί (ή λέξεις-κλειδιά) συγχρονισμένα, το οποίο δέχεται κάθε αντικείμενο ως παράμετρο. Μέσω συγχρονισμένα, μπορείτε να ορίσετε, όπως φαίνεται στο παράδειγμα, το μπλοκ του κώδικα:





 συγχρονισμένες (VAR)







 {



  



 / / Συγχρονισμένη μπλοκ του οριοθετημένου κώδικα (VAR)

  





 }



Πριν από την πραγματοποίηση τις οδηγίες του συγχρονισμένο block, κάθε νήμα αποκτά την κλειδαριά στη μεταβλητή var, να δεσμεύσουν το σύνολο ή περαιτέρω την πρόσβαση στο ίδιο μπλοκ του κώδικα, μέχρι να απελευθερωθεί, ή μέχρι μετά την εκτέλεση το σύνολο του μπλοκ παράδειγμα οριοθετείται κώδικα σε άγκιστρα.

Με άλλα λόγια, η πρώτη το νήμα (που φανταζόμαστε να καλέσετε πρώτα) που εκτελεί τη συγχρονισμένη δήλωση (VAR) στην πραγματικότητα δημιουργεί ένα φράγμα που εμποδίζει κάθε άλλο νήμα να εκτελέσει τη συγχρονισμένη δήλωση (var) μέχρι την πρώτη δεν έχει ολοκληρωθεί την εκτέλεση των συγχρονισμένων μπλοκ του οριοθετημένου κώδικα. Σε αυτά τα τμήματα στη συνέχεια εισάγεται οδηγίες διαβάσει ή να γράψει κοινών δεδομένων.

Με τον τρόπο αυτό είναι εγγυημένη η αμοιβαία αποκλεισμού, η οποία εξασφαλίζει ότι μόνο ένα νήμα σε μια στιγμή μπορεί να πρόσβαση σε έναν κοινόχρηστο μεταβλητή. Θα πρέπει να σημειωθεί, ωστόσο, ότι είναι απαραίτητο να επιλέγουν προσεκτικά το αντικείμενο που θα περάσει ως παράμετρος για να συγχρονιστούν. Πρέπει να είναι ένα αντικείμενο, κοινό για όλα τα θέματα στα οποία θέλετε να δημιουργήσετε έναν μηχανισμό για την αμοιβαία αποκλεισμού, για παράδειγμα, όπως στην προκειμένη περίπτωση, η μεταβλητή που θέλετε να διαβάσετε ή να επεξεργαστείτε.

Φανταστείτε, σε αυτό το σημείο, που θέλετε να ρυθμίσετε το πρόγραμμά μας έτσι ώστε τα θέματα που θέλετε να διαβάσετε την τιμή της μεταβλητής var που θα τεθεί σε αναμονή και να αξιολογεί τα αποτελέσματα μόνο μετά την πρώτη ενημέρωση μετά από αίτησή τους. Φανταστείτε ότι θέλετε να ορίσετε ένα μηχανισμό συγχρονισμού μεταξύ ανάγνωση και τη γραφή.

Στην ίδια κατηγορία ...
E-Learning
Linux (Μάθημα) Linux (Μάθημα)
Πλήρης οδηγός για την open-source σύστημα. Από 49 €.
PHP (Μάθημα) PHP (Μάθημα)
Η πλήρης σειρά μαθημάτων για τη δημιουργία δυναμικών ιστοσελίδων. Από 49 €.
Ruby και Ruby on Rails (Μάθημα) Ruby και Ruby on Rails (Μάθημα)
Δημιουργία λογισμικού και Web εφαρμογές με Ρουμπίνι και RoR. Από 39 €.
Σύνδεσμοι διαφημιζόμενων