繁体   English   中英

如何在线程中同步getter和setter

[英]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是足够的。

你需要锁定吗? 根据你所描述的有限要求,很可能不是。 但请仔细阅读此内容......

  • 你只有一个线程写作。
    • 这意味着变量值永远不会“过时”,因为相互竞争的作家彼此“喋喋不休”(没有可能的竞争条件)。 因此,在单独考虑单个变量时,不需要锁定来提供完整性。
  • 您还没有提到是否需要对多个变量进行某种形式的原子一致修改。 我认为不是。
    • IF ratio必须始终与其他变量一致 (例如,在其他对象中) - 即,如果一组变量必须作为一个组同步更改而没有人只读取部分更改 - 那么需要锁定以使该组具有原子一致性变量 然后,必须在单个锁定区域内一致地修改一致变量,并且读取器必须在读取任何这些变量集之前获得相同的锁(如果需要,则在阻塞状态中等待)。
    • IF比率可以随时作为单个变量更改,并且不需要与其他变量保持一致, 因此不需要锁定,从而为一组变量提供原子一致性

你需要挥发性改性剂吗? 嗯,是!

  • 你有多个线程阅读。
  • 变量可以随时改变,包括即将被读取之前的瞬间。
  • volatile修饰符用于多线程应用程序,以保证“readers”读取的值始终与“writers”写入的值匹配。

如果两个线程正在尝试读取和写入同一个对象,并且您希望保持数据完整性。 只需让你的getter和setter同步。 同步方法时,只有一个线程可以调用同步方法。 当一个线程正在执行其中一个synchronized方法时,没有其他线程可以调用任何同步方法。 因此,在您的情况下,如果您的get&set方法已同步,则可以确定线程是否正在读/写,其他线程无法读取/写入。

希望能帮助到你!

使ratio最终,它将是线程安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM