如果更新到其他线程的缓存不是时间限制,我是否需要使用易失性



我有一个具有一个方法的单例对象:

class static single
{
  String static somefileContent;
   public static void set(String str){somefileContent=str;}
   public static String get(){return somefileContent;}
}

和我有两个线程,

一个线程在操作中查询single.get()中的内容,大约100次/秒。

和另一个线程监视某个文件,在周期内使用set()方法更新字符串,如果文件被修改,刷新内容。

使用旧的字符串值是可以接受的。

我的问题是:我是否需要volatile,因为它不是时间约束?

如果最坏的情况发生,是否读线程永远不会得到更新?

我只是想知道使用普通Java会发生什么?是的,读线程可以在值得到更新后读取旧值。但就像我说的,多读几遍旧的价值是可以接受的。我想知道旧值是否永远留在CPU缓存中。

和Thanks to Vaspar's answer

最好使用ReentrantReadWriteLock,而不需要使用volatile变量。get调用应该是ReadLocked(共享),set调用应该是writellocked(独占)。一旦所有线程都获得了各自的ReadLocks,这些更改就会在所有线程中更新。

所有的ReadWriteLock实现必须保证内存writeLock操作的同步效果(在相对于相关的readLock也持有。也就是说,成功获取读锁的线程将看到所有

对以前版本的写锁进行了更新。

示例代码:

import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;

public class Single {
    private static String                       somefileContent = null;
    private static final ReentrantReadWriteLock readWriteLock   = new ReentrantReadWriteLock();
    private static final ReadLock               readLock        = readWriteLock.readLock();
    private static final WriteLock              writeLock       = readWriteLock.writeLock();
    public static String get() {
        try {
            readLock.lock();
            return somefileContent;
        } finally {
            readLock.unlock();
        }
    }
    public static void set(String str) {
        try {
            writeLock.lock();
            somefileContent = str;
        } finally {
            writeLock.unlock();
        }
    }
}

相关内容

最新更新