1、volatile关键字主要使变量在多线程中可见
什么叫可见,就是在我在主线程中有个volatile变量,多线程中其中一个线程改了这个值,那么我希望其他线程读取到最新的值,就是可见。就是这个变量的改变我其他线程都能读到最新的
public class VolatileTest {
public boolean isRunning = true;
public void setRunning(boolean flag) {
this.isRunning = flag;
}
public void print() {
System.out.println("进入print方法");
while (isRunning) {
// System.out.println("开始执行");
}
System.out.println("线程停止");
}
public static void main(String[] args) {
final VolatileTest volatileTest = new VolatileTest();
Thread thread = new Thread(new Runnable() {
public void run() {
volatileTest.print();
}
});
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
volatileTest.setRunning(false);
System.out.println("已修改");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(volatileTest.isRunning);
}
}
开启个线程,执行print()方法,希望我设置isRunning=false后,不在执行,但是结果是
已经修改为false了,但程序还没停止,为什么呢?
这个可以理解为JVM的缘故,在jdk1.5之后,对线程做了个优化,每个线程有个独立的运行空间,存放主线程中的内容拷贝到自己副本中,是线程执行效率更高些,上面代码中,我们更高变量值,只是在主线程中更新,但是新建线程中变量并没有改变,所以并不影响线程执行中的值。 加了volatile后,保证新建线程每次读取最新变量值。
加了volatile后,只能保证变量可见性,但并不能变量的原子性,保证原子性用AoticInteger
转载于:https://my.oschina.net/u/2504766/blog/757545
分享到:
相关推荐
QT线程同步是多线程编程中的关键概念,确保线程安全,防止数据竞争和死锁等问题。本文将深入讲解QT中的线程同步机制,特别是QMutex和QMutexLocker的使用。 线程互斥(Thread Synchronization)是防止多个线程同时...
* 接收到线程二发送的取消请求信号后退出 * 结束的时候打印字符串“thread1 ,exited!:key 值” 线程二完成以下操作: * 设置 key 值为 6 * 给线程一发送取消请求信号 2. 用多线程实现生产者消费者,至少有两个...
// 在这里编写线程二的执行逻辑 } } ``` 然后,我们可以使用`Thread`类来创建和启动这两个线程: ```java Thread threadOne = new Thread(new ThreadOne()); Thread threadTwo = new Thread(new ThreadTwo()); ...
(多线程计算 线程一:进行读取文件数据到线程队列,线程二:从线程队列中拉取数据进行MD5计算(抄袭了FFMPEG 播放器的 多线程解码的原理),从进度条可以看出几乎读文件线程与计算线程同步,读文件线程首先读出1个...
### 实验二:线程的同步 #### 一、实验目的与背景介绍 在现代操作系统中,线程作为进程中的可调度实体,在多任务处理、提高程序效率方面扮演着极其重要的角色。本实验旨在深入理解线程与进程的概念,并通过实践...
在Revit二次开发中,由于其内置的工作流程是单线程的,这限制了软件的并行处理能力,可能导致在处理大量数据或执行复杂运算时出现性能瓶颈。为了解决这个问题,开发者通常会借助C#语言的多线程技术来提升效率。本文...
例如,进程A可以有线程一、线程二和线程三,它们都访问同一个用户地址空间,但各自执行不同的任务。 线程机制主要有以下几种类型: 1. 用户级线程:线程管理完全由用户空间的线程库完成,操作系统不直接参与。当一...
二、工作者线程 工作者线程(Worker Thread)主要负责后台处理任务,如数据计算、网络通信等,不直接与用户交互。这样设计可以避免因为耗时操作阻塞用户界面,提高用户体验。在MFC中,可以通过CWinThread派生一个新...
第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程第二章多任务和多线程...
#### 二、MFC多线程基础 ##### 2.1 多线程的概念 在计算机科学中,多线程是指一个进程中包含多个线程的并发执行。每个线程都是进程的一个执行路径。通过多线程技术,可以在同一进程内实现任务的并行处理,提高程序...
"多线程编程基础知识" 多线程编程是指在一个程序中同时执行多个线程的技术。每个线程都是一个独立的执行路径,拥有自己的程序计数器、寄存器和堆栈空间。多线程编程可以提高程序的执行效率和响应速度,但也增加了...
实验二的目的是让学生深入理解嵌入式Linux环境下的多线程编程,这涉及到对线程概念、创建和管理的理解,以及如何在编程中引入线程库。线程是操作系统资源调度的基本单位,允许在一个进程中并发执行多个执行路径,...
《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...
二、参数传递 在创建线程时,我们常常需要向线程传递参数以便它能执行特定的任务。在 Delphi 中,我们可以通过重写 TThread 的 Execute 方法来接收和使用这些参数。Execute 方法是线程运行的核心,通常在这里处理...
操作系统实验二:线程调度是计算机科学中一个关键的实践环节,特别是在重庆大学软件学院的课程设置中。这个实验旨在让学生深入理解操作系统如何管理和调度线程,以及在Linux环境下线程调度的工作机制。线程是操作...
线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却完全不同。Java的线程工具易于使用,并且像Java...
《Java多线程编程(第二版)》这本书深入探讨了这一主题,旨在帮助开发者更好地理解和应用Java的并发特性。 在Java中,多线程允许程序同时执行多个任务,提高应用程序的效率和响应性。核心概念包括线程的创建、同步...
其中,第一个参数是用于接收创建新的线程的 id,第二个参数是用于设置线程的属性,一般设置为 NULL,表示使用线程默认属性,第三个参数是函数指针,用于设置线程的主函数,当 pthread_create 函数返回时,则会自动...
本文将深入探讨“漫谈兼容内核之二十二 Windows 线程的调度和运行”这一主题,主要关注Windows线程的创建、调度策略、优先级以及执行过程。 线程是操作系统中的基本执行单元,每个线程都包含一个独立的程序计数器,...