Tag: volatile

会话计数器具有HttpSessionListener和会话计数变量访问权限

我在Sun的“Core Servlets和JavaServer Pages vol 2”中看到了一个带会话计数器的例子。 Counter简单地构建在HttpSessionListener并使用sessionCreated / sessionDestroyed递增/递减会话计数: public class SessionCounter implements HttpSessionListener { private int currentSessionCount = 0; public void sessionCreated(HttpSessionEvent event) { currentSessionCount++; } … public int getTotalSessionCount() { return(totalSessionCount); } … // counter decrement, self registering in context attribute etc. 监听器在上下文中注册自己,因此servlets可以访问它并获得计数器值。 没有同步块。 是否安全, currentSessionCount volatile ? currentSessionCount可以缓存在CPU寄存器中,并且对于使用servlets提供请求的其他线程的精确值是不可见的?

为什么volatile不能正常工作

今天我使用TimerTask创建了一个超时作业,但是遇到了一个新问题,我有一个static volatile boolean变量flag 。 我的理解是,一旦该变量的值发生变化,它就会被所有正在运行的thread通知。 但是当我运行这个程序时,我的输出低于输出,这是不可接受的。 O / P: ————– ————– DD BB Exiting process.. CC 我的期望是我的最后一次打印应该是退出流程..为什么这种奇怪的行为? 我的代码是: public class TimeOutSort { static volatile boolean flag = false; public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { flag = true; System.out.println(“Exiting process..”); // System.exit(0); } […]

这是Double Check Locking的更好版本,没有易失性和同步开销

下面的代码片段来自Effective Java 2nd Edition Double Checked Locking //仔细检查实例字段的延迟初始化的习惯用法 private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // First check (no locking) synchronized(this) { result = field; if (result == null)// Second check (with locking) field = result = computeFieldValue(); } } return result; } 据我所知,Double Checked Locking的主要问题是在第二次检查锁定中重新排序,以便另一个线程可能会看到字段/结果的值为set,这可能仍然在执行中。 […]

方法签名中的’volatile’?

这个很奇怪。 我有以下代码: class A { protected A clone() throws CloneNotSupportedException { return (A) super.clone(); } } 当我通过’showmycode.com’解码其字节码时,它向我展示了以下代码: class A { A() { } protected A clone() throws clonenotsupportedexception { return (A)super.clone(); } protected volatile object clone() throws clonenotsupportedexception { return clone(); } } 在第二个’clone’方法中,方法返回类型是volatile的意思是什么? (此代码是通过Eclipse的默认JDK 1.6编译器编译的)。

同步跨线程共享但不同时访问的对象

假设我有一个包含字段data的共享对象。 多个线程将共享对此对象的引用以访问该字段。 但是,线程永远不会同时访问对象。 我是否需要将data声明为volatile? 这种情况如下: 类Counter定义唯一的字段value和一个方法increment 。 一个线程递增计数器,然后产生另一个递增计数器的线程,等等。 鉴于该程序的逻辑,没有并行访问计数器。 然而,计数器在多个线程中共享。 柜台必须是不稳定的吗? 这种情况的另一种变体是当多个线程操纵一个普通数据的对象X,但是通过依赖于并发控制( wait , notify , synchronize )的另一个对象Y来交替它们的时间执行(以便从不同时访问X)。 对象X的字段是否应该是易变的?

2D易失性数组:自我赋值帮助还是我需要AtomicIntegerArray?

我正在写一个音频DSP应用程序,我选择使用生产者 – 消费者模型。 我一直在阅读关于volatile和其他线程问题的很多内容,但是我对我的一些细节有一些疑问 – 特别是,我需要在线程之间共享的一个问题是数组数组。 我有一个代表生产者的class级。 为了允许处理时间的变化,生产者存储n缓冲区,每当有更多的音频数据可用时它将填充旋转并将缓冲区传递给消费者线程。 我将从我的问题开始,然后我将尝试详细解释我的系统 – 对于长篇文章感到遗憾,谢谢你的支持! 我也非常感谢关于我的实现和线程安全的一般性评论。 我的缓冲区由volatile byte[][]数组表示。 我很清楚volatile只会使引用变为volatile,但是阅读了SO和各种博客文章,似乎我有两个选择: 我可以使用AtomicIntegerArray 。 但: 我会为这样的应用程序降低性能吗? primefaces性甚至是我需要的吗? 我打算一次写入整个数组, 然后我需要它对另一个线程可见,我不需要每个单独的写入是primefaces的或立即可见的。 如果我理解正确(例如这篇博文 ),自我赋值,在我的情况下是: buffers[currentBuffer] = buffers[currentBuffer]将确保发布,您将在下面的代码中看到。 这是正确的,它会导致所有最近的写入变得可见吗? 这是否适用于像这样的2D数组? 我将简要介绍一下生产者类的概述; 这些是实例变量: // The consumer – just an interface with a process(byte[]) method AudioInputConsumer consumer; // The audio data source AudioSource source; // The number of […]

Java易失性并发

好的,我只是读了这个问题您是否曾在Java中使用volatile关键字? ,我使用volatile变量来停止循环。 我也看过这个参考资料, http://www.javamex.com/tutorials/synchronization_volatile.shtml 。 现在文章说波动变量是非阻塞的。 它还说它不能用于读取 – 更新 – 写入序列中的并发性。 这是有道理的,因为它们是非阻塞的。 由于从不缓存volatile变量,因此简单地使用同步来停止循环(来自早期链接)会更快吗? 编辑:使用同步解决方案 public class A{ private boolean test; public A(){ test = true; } public synchronized void stop(){ test = false; } public synchronized boolean isTrue(){ return test; } } public class B extends Thread { private A a; public B(A refA){ a […]

在C / C ++ / Java中使用volatile说明符

在multithreading编程上经历许多资源时,通常会出现对volatile说明符的引用。 很明显,使用此关键字并不是在C / C ++和Java(版本1.4及更早版本)中实现多个线程之间同步的可靠方法。 以下是维基百科列出(不解释如何)作为此说明符的典型用法: – 允许访问内存映射设备 允许在setjmp和longjmp之间使用变量 允许在信号处理程序中使用变量 忙着等待 我可以开始看到这个说明符在上面列出的用法中的作用,但由于我还没有完全理解这些领域中的每一个,我无法弄清楚这个说明符在每个用法中的行为。 有人能解释一下吗

在Java中,同时更改对HashMap读取的引用是安全的

我希望这不是一个太愚蠢的问题…… 我的代码中的代码类似于以下代码: public class ConfigStore { public static class Config { public final String setting1; public final String setting2; public final String setting3; public Config(String setting1, String setting2, String setting3) { this.setting1 = setting1; this.setting2 = setting2; this.setting3 = setting3; } } private volatile HashMap store = new HashMap(); public void swapConfigs(HashMap newConfigs) { this.store […]

订购前的易失性变量和重复

我有两个主题: 主题:1 a = 1; x = b; 主题:2 b = 1 y = a 这里a和b被声明为volatile。 我不明白在a = 1之间如何创建“before-before”边缘; 和y = a; 在x = b之间; 和b = 1; 我知道通过使用volatile变量可以防止从线程缓存中读取过时值。 但是,在订购之前,如何确保变量发生变化。 具体来说,我不明白这一点: 在每次后续读取相同字段之前发生对易失性字段的写入。 锄头有用吗?