[英]How to synchronize getter and setter in threading
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();
}
}
}
我有这个对象。 我在我的应用程序中有一个这个对象的实例,一个线程正在写入比率变量,而其他线程正在读取比率。 这是保护比率变量的正确方法吗? 我需要声明比率是不稳定的吗?
你在同步上做了一些过度杀伤,这会导致一些低效率。
java关键字“ volatile ”表示该变量不会被缓存,并且它将具有多个线程的同步访问权限。
因此,您将锁定一个默认已同步的变量。
因此,您应该删除volatile关键字,或删除重入锁。 可能是不稳定的,因为您将以当前同步的方式更有效地进行多次读取。
对于读/写原始值,单独使用volatile
是足够的。
你需要锁定吗? 根据你所描述的有限要求,很可能不是。 但请仔细阅读此内容......
ratio
必须始终与其他变量一致 (例如,在其他对象中) - 即,如果一组变量必须作为一个组同步更改而没有人只读取部分更改 - 那么需要锁定以使该组具有原子一致性变量 。 然后,必须在单个锁定区域内一致地修改一致变量,并且读取器必须在读取任何这些变量集之前获得相同的锁(如果需要,则在阻塞状态中等待)。 你需要挥发性改性剂吗? 嗯,是!
volatile
修饰符用于多线程应用程序,以保证“readers”读取的值始终与“writers”写入的值匹配。 如果两个线程正在尝试读取和写入同一个对象,并且您希望保持数据完整性。 只需让你的getter和setter同步。 同步方法时,只有一个线程可以调用同步方法。 当一个线程正在执行其中一个synchronized方法时,没有其他线程可以调用任何同步方法。 因此,在您的情况下,如果您的get&set方法已同步,则可以确定线程是否正在读/写,其他线程无法读取/写入。
希望能帮助到你!
使ratio
最终,它将是线程安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.