我有一个具有一个方法的单例对象:
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();
}
}
}