多线程 - voliate
volatile 关键字可以保证可见性和有序性,但是不能保证原子性。
在Java中,多个线程之间共享变量的值可能存在缓存不一致的问题,例如一个线程修改了变量的值,但是其他线程并不能立即看到这个修改。volatile关键字可以保证这个变量的值对于所有线程都是可见的,即任何一个线程对变量的修改都会立即被其他线程看到。
此外,volatile关键字还可以保证变量的有序性。在Java中,编译器、CPU以及操作系统等都可能对指令进行重排,以优化程序性能。在多线程环境下,这种重排可能会导致程序出现错误。volatile关键字可以禁止编译器和CPU对指令进行重排,从而保证了程序的有序性。
package com.lfsun.highconcurrency000.voliate;
/**
* 在这个示例中,有一个MyVolatileExample 类,它有一个boolean类型的成员变量isStopped,使用了volatile关键字修饰。
* 创建了一个名为t1的线程,在while循环中不断输出信息,直到isStopped变为true,这时线程才会停止。
* 在main方法中,创建了一个MyVolatileExample 实例example,启动t1线程并让程序休眠1秒钟,
* 然后调用example的stopThread方法,将isStopped设置为true,这样t1线程就会停止运行。
*
* 需要注意的是,这里使用了volatile关键字保证了isStopped的可见性,当isStopped变为true时,t1线程中的while循环就会立即停止。
*/
public class MyVolatileExample {
private volatile boolean isStopped = false;
public static void main(String[] args) throws InterruptedException {
MyVolatileExample example = new MyVolatileExample();
Thread t1 = new Thread(() -> {
while (!example.isStopped) {
System.out.println("Thread 1 is running");
}
System.out.println("Thread 1 is stopped");
});
t1.start();
Thread.sleep(1000); // 等待1秒钟
example.stopThread();
}
public void stopThread() {
isStopped = true;
}
}
还没有评论,来说两句吧...