同步字段和读写锁定之间有什么区别?

只是想知道以下执行相同功能的代码有何不同


代码 1:


    class ReadWriteCounter {

    ReadWriteLock lock = new ReentrantReadWriteLock();


    private Integer count = 0;


    public Integer incrementAndGetCount() {

        lock.writeLock().lock();

        try {

            count = count + 1;

            return count;

        } finally {

            lock.writeLock().unlock();

        }

    }


    public Integer getCount() {

        lock.readLock().lock();

        try {

            return count;

        } finally {

            lock.readLock().unlock();

        }

    }

}

代码 2:


class ReadWriteCounter {


private Integer count = 0;


public getCount()

{

   synchronized(count){

   return count;

   }

}


public void setCount(Integer i)

{

     synchronized(count){

         count = i;

       }

   }

}

其目的是确保在修改计数时没有其他线程访问它以进行读取,并且在读取时,其他线程都不应访问它以进行写入。哪个是最佳解决方案,为什么?另外,我将在一个类中使用它,其中有需要编辑的字段变量。请提供您的建议。


喵喵时光机
浏览 97回答 2
2回答

心有法竹

重入读写锁是实现您的想法的最佳方式。如果两个或多个线程尝试读取计数,则 synced 将只允许一个线程。但是,当他们都尝试阅读计数时,每个人都可以获得计数的值。

蝴蝶刀刀

您的两种解决方案都可以工作,但是您在实现锁定的方式中存在一个错误。首先是两种方法的区别:重入式读写锁定主要用于以下情况:读取次数多于通常为 10 次读取 :1 次写入的写入操作。这允许同时进行读取而不会相互阻塞,但是当写入开始时,所有读取都将被阻止。因此,性能是主要原因。方法中的错误:要锁定的对象应该是最终的。在 setCount() 中,您有效地交换了对象,这可能会导致此时的脏读。此外,切勿公开要锁定的对象。要锁定的对象应该是私有的和最终的。原因是,如果您碰巧公开了该对象,则调用方可能会碰巧使用返回的对象本身进行锁定,在这种情况下,您将遇到与此类本身外部的组件的争用问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java