也许实现 volatile 变量的规范使用仅仅是使用一个布尔状态标志,用于指示发生了一个重要的一次性事件,例如完成初始化或请求停机。
package test; public class Test { public boolean shutdownRequested= false; public void shutdown() { shutdownRequested = true; } public void doWork() { while (!shutdownRequested) { // do stuff } System.out.println("doWork end"); } public static void main(String[] args)throws Exception { Test test = new Test(); new Thread(new Runnable() { @Override public void run() { test.doWork(); } }).start(); System.out.println("main start>>>>>>>>>>>>>>>>>>"); Thread.sleep(2000); test.shutdown(); System.out.println("main end>>>>>>>>>>>>>>>>>>"); Thread.sleep(200000); } }
线程1执行doWork()的过程中,可能有另外的线程2调用了shutdown,所以boolean变量必须是volatile。
而如果使用 synchronized
块编写循环要比使用 volatile 状态标志编写麻烦很多。由于 volatile 简化了编码,并且状态标志并不依赖于程序内任何其他状态,因此此处非常适合使用 volatile。
这种类型的状态标记的一个公共特性是:通常只有一种状态转换;shutdownRequested
标志从false
转换为true
,然后程序停止。这种模式可以扩展到来回转换的状态标志,但是只有在转换周期不被察觉的情况下才能扩展(从false
到true
,再转换到false
)。此外,还需要某些原子状态转换机制,例如原子变量。
相关推荐
模式 #1:状态标志 状态标志是volatile 变量的规范使用之一,用于指示发生了一个重要的一次性事件。例如,在一个服务器应用程序中,使用 volatile 变量来指示服务器是否已经启动。 模式 #2:双重检查锁定模式 双重...
- **功能**:可以配置为输入或输出模式,用于读取外部信号或向外部设备发送信号。 - **应用场景**:按键检测、指示灯控制等简单输入输出操作。 #### GPT: General Purpose Timer - **含义**:通用定时器,一种常见...
选择哪种方式取决于具体的开发需求和场景。例如,在追求代码简洁性和效率的情况下,可以直接使用指针访问;而在追求代码可读性和可维护性时,则更适合使用宏定义或结构体成员的方式。开发人员应该根据项目的具体情况...
1. **状态标志**:`volatile`关键字非常适合用于表示某个状态标志,如线程是否应该停止运行。由于`volatile`关键字保证了线程间的可见性,因此当一个线程改变了这个状态标志,其他线程能够立即感知到这个变化。 2. ...
单例模式的实现方式多种多样,每种都有其适用场景。在实际应用中,我们需要根据需求选择合适的实现方式,同时考虑性能、线程安全和可维护性等因素。在Java中,考虑到线程安全和简洁性,推荐使用枚举方式实现单例。...
### 1. 意外中断 #### 分析: - **定义**:意外中断通常指的是由于程序设计不当,导致系统频繁进入某个或某些中断服务程序,从而使主程序无法正常执行的情况。 - **原因**: - 开启了某个中断但未正确处理该中断的...
通过本篇文章的学习,我们可以了解到内嵌汇编的基本语法、使用场景以及如何通过具体的示例来加深对其工作原理的理解。尽管内嵌汇编提供了高度定制化的控制能力,但其编写和维护通常较为复杂,因此在实际项目中应当...
在实际应用中,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。 volatile 变量的使用场景包括: * 多个变量之间或者某个变量的当前值与修改后值之间没有约束的...
2. **多任务环境**:在多任务环境中,各个任务之间共享的标志应该标记为 `volatile`,以确保线程间的同步和通信。 - 示例:如果多个任务需要通过共享变量来协调它们的行为,那么这些变量应该使用 `volatile` 来标记...
1. Volatile与常量的区别: - 常量(如5或"abc")是放在内存的只读区域,不能被修改。 - Volatile变量则是存储在普通内存中,可以被其他线程或外部设备修改。例如,一个硬件寄存器或中断服务程序可能改变的变量就...
1. **const与volatile的结合使用**:一个变量可以同时声明为`const`和`volatile`。例如,只读的状态寄存器可以被声明为`const volatile int statusRegister;`。这里的`const`表明程序不应尝试修改这个寄存器的值,而...
#### 三、volatile的使用场景 ##### 3.1 状态标记 `volatile`变量常用于控制多线程之间的开关标志。例如,在一个线程池中,可以通过`volatile`变量作为线程是否继续执行的标志。当主程序决定终止线程时,只需要修改...
本文将围绕宏定义`#define XBYTE ((unsigned char volatile xdata *) 0)`展开,深入探讨其含义、作用以及应用场景。 #### 宏定义详解 宏定义`#define XBYTE ((unsigned char volatile xdata *) 0)`主要包含以下几...
### AVR-GCC 中如何使用 `volatile` 关键字 #### 1. `volatile` 关键字的基本概念 在编程语言中,尤其是C/C++中,`volatile` 是一个类型限定符,用来修饰变量,告知编译器该变量的值可能会在编译器未监控的情况下...
1. 并行设备的硬件寄存器(如:状态寄存器):这些寄存器的值可能会被外部设备改变,因此需要使用volatile修饰符来确保编译器每次都读取最新的值。 2. 一个中断服务子程序中会访问到的非自动变量(Non-automatic ...
以上就是单例模式的常见实现方式,每种都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的单例模式实现。在设计模式中,单例模式不仅限于上述实现,还可以与其他模式结合使用,如工厂模式、装饰...