`
m635674608
  • 浏览: 5042959 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

volatile的适用场景 模式 #1:状态标志 demo

    博客分类:
  • java
 
阅读更多

也许实现 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,然后程序停止。这种模式可以扩展到来回转换的状态标志,但是只有在转换周期不被察觉的情况下才能扩展(从falsetrue,再转换到false)。此外,还需要某些原子状态转换机制,例如原子变量。

分享到:
评论

相关推荐

    Java volatile的适用场景实例详解

    模式 #1:状态标志 状态标志是volatile 变量的规范使用之一,用于指示发生了一个重要的一次性事件。例如,在一个服务器应用程序中,使用 volatile 变量来指示服务器是否已经启动。 模式 #2:双重检查锁定模式 双重...

    mtk常语缩写,对看代码有帮助.txt

    - **功能**:可以配置为输入或输出模式,用于读取外部信号或向外部设备发送信号。 - **应用场景**:按键检测、指示灯控制等简单输入输出操作。 #### GPT: General Purpose Timer - **含义**:通用定时器,一种常见...

    DSP头文件编程方式

    选择哪种方式取决于具体的开发需求和场景。例如,在追求代码简洁性和效率的情况下,可以直接使用指针访问;而在追求代码可读性和可维护性时,则更适合使用宏定义或结构体成员的方式。开发人员应该根据项目的具体情况...

    Java并发编程:volatile关键字解析

    1. **状态标志**:`volatile`关键字非常适合用于表示某个状态标志,如线程是否应该停止运行。由于`volatile`关键字保证了线程间的可见性,因此当一个线程改变了这个状态标志,其他线程能够立即感知到这个变化。 2. ...

    单例模式的几种实现方式demo

    单例模式的实现方式多种多样,每种都有其适用场景。在实际应用中,我们需要根据需求选择合适的实现方式,同时考虑性能、线程安全和可维护性等因素。在Java中,考虑到线程安全和简洁性,推荐使用枚举方式实现单例。...

    单片机程序死机跑飞原因分析说明

    ### 1. 意外中断 #### 分析: - **定义**:意外中断通常指的是由于程序设计不当,导致系统频繁进入某个或某些中断服务程序,从而使主程序无法正常执行的情况。 - **原因**: - 开启了某个中断但未正确处理该中断的...

    内嵌汇编用法及分析 asm

    通过本篇文章的学习,我们可以了解到内嵌汇编的基本语法、使用场景以及如何通过具体的示例来加深对其工作原理的理解。尽管内嵌汇编提供了高度定制化的控制能力,但其编写和维护通常较为复杂,因此在实际项目中应当...

    Java线程:volatile关键字

    在实际应用中,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。 volatile 变量的使用场景包括: * 多个变量之间或者某个变量的当前值与修改后值之间没有约束的...

    volatile使用详解

    2. **多任务环境**:在多任务环境中,各个任务之间共享的标志应该标记为 `volatile`,以确保线程间的同步和通信。 - 示例:如果多个任务需要通过共享变量来协调它们的行为,那么这些变量应该使用 `volatile` 来标记...

    Volatile详解,深入学习Volatile

    1. Volatile与常量的区别: - 常量(如5或"abc")是放在内存的只读区域,不能被修改。 - Volatile变量则是存储在普通内存中,可以被其他线程或外部设备修改。例如,一个硬件寄存器或中断服务程序可能改变的变量就...

    volatile详解

    1. **const与volatile的结合使用**:一个变量可以同时声明为`const`和`volatile`。例如,只读的状态寄存器可以被声明为`const volatile int statusRegister;`。这里的`const`表明程序不应尝试修改这个寄存器的值,而...

    深入解析volatile关键字:保障多线程下的数据一致性与可见性.pdf

    #### 三、volatile的使用场景 ##### 3.1 状态标记 `volatile`变量常用于控制多线程之间的开关标志。例如,在一个线程池中,可以通过`volatile`变量作为线程是否继续执行的标志。当主程序决定终止线程时,只需要修改...

    单片机-#define XBYTE ((unsigned char volatile xdata *) 0)

    本文将围绕宏定义`#define XBYTE ((unsigned char volatile xdata *) 0)`展开,深入探讨其含义、作用以及应用场景。 #### 宏定义详解 宏定义`#define XBYTE ((unsigned char volatile xdata *) 0)`主要包含以下几...

    AVR-GCC 中如何使用volatile 关键字.pdf

    ### AVR-GCC 中如何使用 `volatile` 关键字 #### 1. `volatile` 关键字的基本概念 在编程语言中,尤其是C/C++中,`volatile` 是一个类型限定符,用来修饰变量,告知编译器该变量的值可能会在编译器未监控的情况下...

    volatile的用法讲解

    1. 并行设备的硬件寄存器(如:状态寄存器):这些寄存器的值可能会被外部设备改变,因此需要使用volatile修饰符来确保编译器每次都读取最新的值。 2. 一个中断服务子程序中会访问到的非自动变量(Non-automatic ...

    设计模式之单例模式源码demo

    以上就是单例模式的常见实现方式,每种都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的单例模式实现。在设计模式中,单例模式不仅限于上述实现,还可以与其他模式结合使用,如工厂模式、装饰...

Global site tag (gtag.js) - Google Analytics