public class IntermediateMessage {
private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock read = readWriteLock.readLock();
private final Lock write = readWriteLock.writeLock();
private volatile double ratio;
public IntermediateMessage(){
this.ratio=1.0d;
}
public IntermediateMessage(double ratio){
this.ratio = ratio;
}
public double getRatio(){
read.lock();
try{
return this.ratio;
}
finally{
read.unlock();
}
}
public void setRatio(double ratio){
write.lock();
try{
this.ratio = ratio;
}
finally{
write.unlock();
}
}
}
我有这个对象。我在我的应用程序中有一个这个对象的实例,一个线程正在写入比率变量,而其他线程正在读取比率。这是保护比率变量的正确方法吗?我需要声明比率是不稳定的吗?
答案 0 :(得分:1)
你正在对同步造成一些过度杀伤,导致效率低下。
java关键字“volatile”表示该变量不会被缓存,并且它将具有多个线程的同步访问权。
所以你要锁定一个默认已经同步的变量。
因此,您应该删除volatile关键字,或删除重入锁。可能是不稳定的,因为您将以当前同步的方式更有效地进行多次读取。
答案 1 :(得分:1)
对于读/写原始值,仅volatile
就足够了。
答案 2 :(得分:1)
你需要锁定吗?根据你所描述的有限要求,很可能不是。但请仔细阅读此内容......
ratio
必须始终与其他变量保持一致(例如,在其他对象中) - 即,如果一组变量必须同步更改为一组而没有人只读取其中一部分更改 - 然后需要锁定才能为变量集提供原子一致性。然后,必须在单个锁定区域内一致地修改一致变量,并且读取器必须在读取任何这些变量集之前获得相同的锁(如果需要,则在阻塞状态中等待)。 你需要挥发性修饰剂吗?嗯,是的!
volatile
修饰符用于多线程应用程序,以确保“readers”读取的值始终与“writer”所写的值匹配。答案 3 :(得分:0)
如果两个线程试图在同一个对象上进行读写,并且希望保持数据的完整性。只需让你的getter和setter同步。同步方法时,只有一个线程可以调用同步方法。当一个线程正在执行其中一个synchronized方法时,没有其他线程可以调用任何同步方法。所以在你的情况下,如果你有你的获得& set method synchronized,你可以确定一个线程是否在读/写,没有其他线程可以进行读/写。
希望它有所帮助!
答案 4 :(得分:-1)
让ratio
成为最终版,它将是线程安全的。