我真的很困惑我读了关于在Java中的volatile关键字的应用程序。 以下说法正确吗? “写入到一个易失性字段发生在每个后续读取相同的字段” 理想情况下,何时应该使用volatile关键字 有什么区别: class TestClass { private int x; synchronized int get(){return x;} synchronized void set(int x){this.x = x;} } 和 class TestClass { private volatile int x; int get(){return x;} void set(int x){this.x = x;} }
我在java中看到了一些例子,他们在代码块上进行同步以更改某个variables,而该variables最初被声明为volatile。我看到,在一个单例类的例子中,他们声明了唯一实例是volatile,并且它们同步了块初始化该实例…我的问题是为什么我们声明它是同步的,为什么我们需要做这两个? 是不是其中之一是足够的? public class someClass { volatile static uniqueInstance = null; public static someClass getInstance() { if(uniqueInstance == null) { synchronized(someClass.class) { if(uniqueInstance == null) { uniqueInstance = new someClass(); } } } return uniqueInstance; } 提前致谢。
Java中的volatile int是线程安全的吗? 也就是说,它可以安全地读取和写入,而不locking?
我已经看过SO中的其他volatile和Atomicxxxx问题(包括这个 ),并且已经阅读了java.util.current.atomic的描述,对这些细微之处我还不太满意。 如果我试图决定使用volatile boolean和AtomicBoolean ,是否有除AtomicBoolean提供的primefaces读取 – 修改 – 写入操作之间的实际差异? (比如compareAndSet()和getAndSet() ) 假设我有 volatile boolean flag; 然后一个或多个线程设置标志(但不清除它)。 如果我有一个线程读取标志,如果设置,做一个动作,然后清除标志,是不是足够的? AtomicBoolean的成本比volatile boolean更高 内存空间 性能命中( volatile boolean似乎需要内存屏蔽, AtomicBoolean似乎需要内存屏蔽+根据java.util.current.atomic描述对CAS操作进行一些次要locking) 我的直觉是和AtomicBoolean一起去,并且是安全的,但我想知道是否有使用volatile boolean的情况(例如,如果我有成千上万的实例,性能是一个问题)。
某些语言提供了一个volatile修饰符,它被描述为在读取支持variables的内存之前执行“读取内存障碍”。 读取内存屏障通常被描述为确保CPU在屏障之前执行读取之前所请求的读取,然后在屏障之后执行读取请求的方式。 但是,使用这个定义,似乎仍然可以读取陈旧的价值。 换句话说,以某一顺序执行读取似乎并不意味着必须查阅主存储器或其他CPU以确保读取的后续值实际上反映了在读取屏障时系统中的最新值或者在阅读障碍。 那么,volatile是否确实保证读取的是最新的值,或者只是读取的值至less与屏障之前的读取值一样是最新的(gasp!)。 还是其他一些解释? 这个答案的实际含义是什么?
我读到下面的地方。 Java volatile关键字并不意味着primefaces化,它的常见误解是,在声明volatile之后, ++操作将是primefaces操作,为了使操作primefaces化,还需要使用Java中的synchronized方法或块来确保独占访问。 那么如果两个线程同时攻击一个volatilevariables,会发生什么呢? 这是否意味着谁locking了它,这将首先确定它的价值。 而如果在此期间,其他线程出现并读取旧值,而第一个线程正在改变它的值,那么不新的线程将读取其旧值? Atomic和volatile关键字有什么区别?
从我从Sutter和其他人那里读到的,你会认为volatile和并发编程是完全正交的概念,至less就C / C ++而言。 但是,在GCC 实现中,所有std::atomic的成员函数都有volatile限定符。 Anthony Williams在std::atomic的实现中也是如此。 那么有什么事情,我的atomic<>variables需要volatile或不?
我读过“ 什么时候在Java中使用'volatile'? ”但我仍然感到困惑。 我如何知道什么时候应该标记variablesvolatile? 如果我弄错了,或者在需要它的东西上忽略一些不稳定的东西,或者把一些不稳定的东西放在那些不需要的东西上? 在计算multithreading代码中哪些variables应该是易变的时,有哪些经验法则?
我想编写一个可视化地演示volatile关键字行为的小程序。 理想情况下,它应该是一个执行并发访问非易失性静态字段,并因此得到不正确行为的程序。 在同一个程序中添加volatile关键字可以解决这个问题。 这是我无法实现的。 即使尝试多次,启用优化等,我总是得到一个正确的行为,没有“挥发性”的关键字。 你对这个话题有什么想法吗? 你知道如何在简单的演示程序中模拟这样的问题吗? 它依赖于硬件吗?
primefaces/易失性/同步如何在内部工作? 以下代码块有什么区别? 代码1 private int counter; public int getNextUniqueIndex() { return counter++; } 代码2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } 代码3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } volatile工作是否以下列方式进行? 是 volatile int i = 0; void incIBy5() { i += 5; } 相当于 Integer i = 5; […]