Sobes.tech
Middle+

Javaда volatile ачкыч сөзү эмне жана ал кандайча колдонулат?

sobes.tech AI

AIден жооп

volatile бардык ағындар үчүн өзгөрмөнүн өзгөрүүлөрүнүн көрүнүшүн камсыздайт.

  • Көрүнүш кепилдиги: Бир ағын volatile өзгөрмөнү өзгөрткөндө, башка ағындар кепилдик менен бул өзгөрүүнү көрөт. volatile жок болсо, өзгөрүүлөр ағындын кэшинде кала алат жана негизги эс тутум менен синхрондоштурулбайт.
  • Атомар эмес: 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();
    }
}