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等。
volitate关键字
最新推荐文章于 2024-08-30 18:36:44 发布