import java.util.concurrent.atomic.AtomicInteger;
public class VolatilePattern1 extends Thread{
volatile boolean shutdownRequested;
private AtomicInteger count = new AtomicInteger();
public void shutdown() {
shutdownRequested = true;
}
public void run() {
System.out.println("Thread:" + Thread.currentThread().getName()+" started.");
while (!shutdownRequested) {
System.out.println("working ..."+count);
count.getAndIncrement();
try {
Thread.sleep(50);
} catch(InterruptedException ie) {
ie.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("Thread:" + Thread.currentThread().getName()+" started.");
VolatilePattern1 vp = new VolatilePattern1();
vp.start();
try {
Thread.sleep(2000);
} catch(InterruptedException ie) {
ie.printStackTrace();
} finally {
vp.shutdown();
}
}
}
分享到:
相关推荐
* 下面的函数有什么错误:intsquare(volatile int*ptr){return *ptrptr;}答案是这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:intsquare...
- volatile不能替代锁:尽管volatile可以保证可见性,但无法保证原子性。例如,两个线程同时读写一个volatile变量,可能导致数据不一致。 - volatile与指针:如果指针本身是volatile,意味着指针的值(地址)可能...
例如,一个只读的状态寄存器,它会被标记为`volatile`是因为它的值可能会被意外更改,同时标记为`const`则意味着程序不应该试图去修改它。这样的设计既确保了数据的安全性又保证了程序能够及时获取最新的状态信息。 ...
在多线程共享变量并使用互斥锁保护时,加不加volatile可能不会有实质区别,因为互斥锁已经保证了对内存的访问顺序。但在没有同步机制的多线程环境中,或者涉及到硬件设备、非线性控制流时,volatile是不可或缺的,以...
2. volatile修饰符不能与const修饰符同时使用,因为volatile修饰符意味着变量的值可能会改变,而const修饰符意味着变量的值不能改变。 3. 使用volatile修饰符可能会影响编译器的优化,因此需要根据实际情况进行选择...
例如,如果你有一个计数器并尝试通过多个线程同时递增,volatile并不能保证递增操作的原子性,因此仍然需要使用synchronized或者其他并发控制机制来保证。 下面是一些关于volatile的常见问题及其解答: 1. **参数...
5. `volatile`与`const`结合:`volatile const`变量表示其值可以被外部因素改变,但程序内部不应尝试修改。 在面试和找工作中,理解和掌握`const`和`volatile`的使用是评估程序员基础功底的重要标准。熟悉它们可以...
因此,编译器在处理`volatile`变量时必须特别小心,不能假设它的值会保持不变。 具体来说,编译器在遇到`volatile`变量时必须确保每次对该变量的操作都是直接读取或写入内存中的值,而不是使用寄存器中的副本。这是...
* volatile 变量不能提供原子特性,因此不能用于实现计数器、互斥锁或任何具有与多个变量相关的不变式。 * volatile 变量的使用需要满足两个条件:对变量的写操作不依赖于当前值,以及该变量没有包含在具有其他变量...
一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,...
当一个变量被声明为`volatile`时,编译器会知道这个变量的值可能在运行时被外部不可预见的因素(比如硬件中断、多线程等)修改。因此,每次访问`volatile`变量时,都会从内存中读取最新的值,而不是依赖于寄存器中...
在 C 语言中,volatile 关键字是用来指定变量的存储类别的,它告诉编译器这个变量的值可能会在编译器不知道的情况下被修改,因此需要重新加载这个变量的值。volatile 关键字的使用方法可以分为两种情况:一是用来...
如果不使用`volatile`,编译器可能会优化代码,只读取一次值并将其存放在寄存器中,从而导致错误的结果。 #### 正确示例 ```c uint32_t square(uint32_t *ptr) { return *ptr * *ptr; } ``` 在这个例子中,由于`*...
在深入理解volatile时,我们需要考虑JVM内存模型、处理器缓存以及底层的汇编指令,这有助于我们更好地理解和使用volatile,解决并发编程中的问题。在实际开发中,合理利用volatile可以避免不必要的锁同步,提升程序...
这里的`const`表明程序不应尝试修改这个寄存器的值,而`volatile`则表示该寄存器的值可能被外部因素改变。 2. **volatile指针**:指针也可以被声明为`volatile`,这在中断服务子程序中修改指向缓冲区的指针时非常...
如果这些变量不声明为volatile,编译器可能会优化掉对它们的读取和写入,导致程序行为不符合预期。 例如,在GD32F303的中断服务程序中,可能需要更新一个标志位来指示中断已处理。如果不声明这个标志位为volatile,...
2. 多任务环境下的用法:在多任务系统中,如果有多个任务共享同一个变量,为了保证变量值的实时性和准确性,应当将共享变量声明为volatile。这样,无论何时读取该变量,都将直接从内存中获取最新值,而不是使用可能...