多线程 - voliate

青旅半醒 2023-09-27 18:20 50阅读 0赞

volatile 关键字可以保证可见性和有序性,但是不能保证原子性。

在Java中,多个线程之间共享变量的值可能存在缓存不一致的问题,例如一个线程修改了变量的值,但是其他线程并不能立即看到这个修改。volatile关键字可以保证这个变量的值对于所有线程都是可见的,即任何一个线程对变量的修改都会立即被其他线程看到。

此外,volatile关键字还可以保证变量的有序性。在Java中,编译器、CPU以及操作系统等都可能对指令进行重排,以优化程序性能。在多线程环境下,这种重排可能会导致程序出现错误。volatile关键字可以禁止编译器和CPU对指令进行重排,从而保证了程序的有序性。

  1. package com.lfsun.highconcurrency000.voliate;
  2. /**
  3. * 在这个示例中,有一个MyVolatileExample 类,它有一个boolean类型的成员变量isStopped,使用了volatile关键字修饰。
  4. * 创建了一个名为t1的线程,在while循环中不断输出信息,直到isStopped变为true,这时线程才会停止。
  5. * 在main方法中,创建了一个MyVolatileExample 实例example,启动t1线程并让程序休眠1秒钟,
  6. * 然后调用example的stopThread方法,将isStopped设置为true,这样t1线程就会停止运行。
  7. *
  8. * 需要注意的是,这里使用了volatile关键字保证了isStopped的可见性,当isStopped变为true时,t1线程中的while循环就会立即停止。
  9. */
  10. public class MyVolatileExample {
  11. private volatile boolean isStopped = false;
  12. public static void main(String[] args) throws InterruptedException {
  13. MyVolatileExample example = new MyVolatileExample();
  14. Thread t1 = new Thread(() -> {
  15. while (!example.isStopped) {
  16. System.out.println("Thread 1 is running");
  17. }
  18. System.out.println("Thread 1 is stopped");
  19. });
  20. t1.start();
  21. Thread.sleep(1000); // 等待1秒钟
  22. example.stopThread();
  23. }
  24. public void stopThread() {
  25. isStopped = true;
  26. }
  27. }

发表评论

表情:
评论列表 (有 0 条评论,50人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线 - voliate

    volatile 关键字可以保证可见性和有序性,但是不能保证原子性。 在Java中,多个线程之间共享变量的值可能存在缓存不一致的问题,例如一个线程修改了变量的值,但是其他

    相关 线 - voliate 关键字

    介绍 volatile 是 Java 中的关键字,用于修饰变量。它的作用是强制对被修饰的变量的写操作立即刷新到主存中,并强制对该变量的读操作从主存中读取最新的值,而不是使

    相关 Java 线-线通信

    最近,美美非常的爱吃栗子,剥栗子却有些麻烦,这个任务理所当然的交给了帅帅,每一次,帅帅都会把热气腾腾的栗子剥好,然后放进一个盘子里,而美美每次都会从盘子里拿一个栗子吃: !

    相关 线】——Callable创建线

        之前小编的博客简单介绍了两种创建线程的方式,随着小编工作过程对这一部分的深入,对这一部分有更深入的理解,也知道其他创建多线程方式,在原来的基础在深入一下! 回顾