Στον προγραμματισμό, ορίζουμε παραμέτρους μεθόδου για τη μετάδοση μεταβλητού περιεχομένου, εάν το επίπεδο της μεθόδου εκτέλεσης είναι βαθύ, τότε κάθε μέθοδος πρέπει να ορίσει τις παραμέτρους που πρέπει να περάσουν, αυτή τη στιγμή, ορισμένες μεταβλητές μπορούν να περάσουν μέσω του ThreadLocal, εφόσον όλες οι μέθοδοι εκτελούνται στο ίδιο νήμα, η τιμή του ThreadLocal μπορεί να οριστεί και να διαβαστεί.
Η κλάση ThreadLocal χρησιμοποιείται για την παροχή τοπικών μεταβλητών μέσα στο νήμα. Όταν αυτές οι μεταβλητές είναι προσβάσιμες (get/set) σε περιβάλλον πολλαπλών νημάτων, οι μεταβλητές σε κάθε νήμα είναι σχετικά ανεξάρτητες από τις μεταβλητές σε άλλα νήματα.
Το ThreadLocal θα λάβει πρώτα το τρέχον νήμα (Thread t = Thread.currentThread()) κατά την εκτέλεση της μεθόδου set και θα χρησιμοποιήσει το τρέχον νήμα για να λάβει ένα ThreadLocalMap, εάν ο χάρτης δεν είναι κενός, σημαίνει ότι το τρέχον νήμα έχει έναν προηγουμένως δεσμευμένο χάρτη και, στη συνέχεια, ενημερώστε την τιμή αυτού του χάρτη, εάν όχι, χρησιμοποιήστε τον εαυτό του ως κλειδί για να βάλετε την τιμή στον χάρτη, έτσι ώστε να πραγματοποιηθεί η δέσμευση μεταβλητών και νημάτων.
Δοκιμάστε τον κώδικα, ρυθμίστε το χώρο συγκέντρωσης νημάτων ώστε να διατηρεί το πολύ 5 νήματα και όταν καλούμε τη μέθοδο λήψης ThreadLocal στην περίπτωση πολλαπλών νημάτων, θα λάβουμε τα δεδομένα ThreadLocal (Σύνολο δεδομένων από άλλα νήματα), εμάςΗ μέθοδος συνόλου ThreadLocal δεν καλείται στο τρέχον νήμα για να ορίσει τα δεδομένα, όπως φαίνεται στο παρακάτω σχήμα:
Αιτίες σφάλματος:Μόλις επαναχρησιμοποιηθεί ένα νήμα, είναι πιθανό η πρώτη τιμή που λαμβάνεται από το ThreadLocal να είναι μια τιμή που έχει απομείνει από άλλα προηγούμενα νήματα。
Επειδή, αφού τελειώσουμε με το ThreadLocal στο τρέχον νήμα,Φροντίστε να καλέσετε την αφαίρεση για έγκαιρη εκκαθάριση。 Οπως φαίνεται παρακάτω:
Κώδικας:
(Τέλος)
|