Sobes.tech
Middle+

Τι είναι η λέξη-κλειδί volatile στη Java και πώς χρησιμοποιείται;

sobes.tech AI

Απάντηση από AI

Το volatile διασφαλίζει την ορατότητα των αλλαγών μιας μεταβλητής σε όλα τα νήματα.

  • Εγγύηση ορατότητας: Όταν ένα νήμα αλλάζει μια volatile μεταβλητή, άλλα νήματα εγγυώνται ότι θα δουν αυτή την αλλαγή. Χωρίς volatile, οι αλλαγές μπορεί να παραμείνουν στην cache του νήματος, χωρίς να συγχρονίζονται με τη βασική μνήμη.
  • Μη ατομική: Το volatile δεν εγγυάται την ατομικότητα των λειτουργιών. Λειτουργίες όπως η αύξηση (i++) δεν είναι ατομικές και μπορεί να οδηγήσουν σε συνθήκες αγώνα ακόμα και με volatile.

Χρησιμοποιείται για:

  • Σημαίες κατάστασης: Όταν ένα νήμα ορίζει μια σημαία για να ενημερώσει άλλα νήματα για μια κατάσταση.
  • Απλές λειτουργίες ανάγνωσης/εγγραφής: Όταν οι λειτουργίες με μια μεταβλητή περιλαμβάνουν μια μόνο εγγραφή από ένα νήμα και πολλαπλές αναγνώσεις από άλλα.

Παράδειγμα χρήσης με σημαία:

// Παράδειγμα χρήσης του volatile για σημαία τερματισμού
public class VolatileExample {
    private volatile boolean terminated = false;

    public void start() {
        new Thread(() -> {
            while (!terminated) {
                // Εργασία νήματος
                System.out.println("Το νήμα λειτουργεί...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            System.out.println("Το νήμα τερματίστηκε.");
        }).start();
    }

    public void stop() {
        terminated = true; // Αλλαγή στη μεταβλητή volatile
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample example = new VolatileExample();
        example.start();
        Thread.sleep(500);
        example.stop();
    }
}