如何在线程中同步getter和setter

时间:2013-05-29 01:09:20

标签: java multithreading readerwriterlock

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();
        }
    }
}

我有这个对象。我在我的应用程序中有一个这个对象的实例,一个线程正在写入比率变量,而其他线程正在读取比率。这是保护比率变量的正确方法吗?我需要声明比率是不稳定的吗?

5 个答案:

答案 0 :(得分:1)

你正在对同步造成一些过度杀伤,导致效率低下。

java关键字“volatile”表示该变量不会被缓存,并且它将具有多个线程的同步访问权。

所以你要锁定一个默认已经同步的变量。

因此,您应该删除volatile关键字,或删除重入锁。可能是不稳定的,因为您将以当前同步的方式更有效地进行多次读取。

答案 1 :(得分:1)

对于读/写原始值,仅volatile就足够了。

答案 2 :(得分:1)

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

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

你需要挥发性修饰剂吗?嗯,是的!

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

答案 3 :(得分:0)

如果两个线程试图在同一个对象上进行读写,并且希望保持数据的完整性。只需让你的getter和setter同步。同步方法时,只有一个线程可以调用同步方法。当一个线程正在执行其中一个synchronized方法时,没有其他线程可以调用任何同步方法。所以在你的情况下,如果你有你的获得& set method synchronized,你可以确定一个线程是否在读/写,没有其他线程可以进行读/写。

希望它有所帮助!

答案 4 :(得分:-1)

ratio成为最终版,它将是线程安全的。