volitate关键字

1 关于volitate关键字,描述不正确的是()
A 用volitate 修饰的变量, 每一次的更新对其他的线程都是可见的;
B 对volitate 的操作是原子性的
C 对volitate 的操作不会造成阻塞
D 不依赖其他的锁机制,多线程环境下的技数器可以用volitate 来实现
注解: 一旦一个共享变量(类的成员变量,类的静态成员变量)被volitate修饰,那么,其就具备了两层含义:
1) 保证了不同的线程对这个变量进行操作的时候的可见性;即一个线程修改了某个变量, 这个新的值对于其他的线程来说是立即
可见的。
2) 禁止进行指令的重排序(volatile关键字能确保变量在线程中的操作不会被重排序而是按照代码中规定的顺序进行访问)
volatile 只提供了保证访问该变量,每一次读取改变量的时候都是从内存中读取,并不会使用寄存器缓存该值.
对该变量的修改,volatile 并不提供原子性的保证;
由于及时更新,volitate 可能导致另一线程访问最新变量值,无法跳出循环的情况,
多线程下,计数器必须使用保护锁;
*注:原子性解释1:原子性就是说一个操作不可以被中途cpu暂停然后调度, 即不能被中断, 要不就执行完, 要不就不执行. 如果一个操作是原子性的,那么在多线程环境下, 就不会出现变量被修改等奇怪的问题。
原子性解释2:原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。Java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

volatile是C语言中的一个关键字,用来修饰变量,表示它是易变的,即使在没有发生改变的情况下,也可能被其他线程或者中断服务程序所修改。 下面是一个使用volatile关键字的C语言示例代码: ```c #include <stdio.h> volatile int count = 0; // 使用volatile修饰的全局变量 // 线程函数 void* threadFunction(void* arg) { while(count < 5) { // 在计数小于5的情况下,不断自增并打印 count++; printf("Count: %d\n", count); } return NULL; } int main() { pthread_t thread; pthread_create(&thread, NULL, threadFunction, NULL); while(count < 5) { // 在主线程中打印count变量 printf("Main: %d\n", count); } pthread_join(thread, NULL); return 0; } ``` 上述示例代码使用了volatile关键字修饰的全局变量`count`。首先,在`threadFunction`线程函数中,线程会不断自增`count`并打印,直到`count`的值达到5为止。然后,在主线程中,在`count < 5`的情况下,会不断打印`count`的当前值。 由于`count`是使用volatile修饰的,这意味着编译器不能对该变量进行优化,它的值可能会被其他线程或中断服务程序修改,从而保证了变量的可见性和正确性。因此,即使主线程中的条件判断和打印操作看似在循环中,但在多线程环境下,`count`的修改可能会影响到主线程的行为,使得主线程的循环退出。 总结来说,volatile关键字用于修饰易变的变量,保证了变量在多线程或中断环境下的可见性和正确性。通过使用volatile关键字,可以使得变量的读写操作不会被编译器优化破坏,保证代码的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值