为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喵时光机 2022-09-14 17:17:36
只是想知道以下执行相同功能的代码有何不同代码 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;       }   }}其目的是确保在修改计数时没有其他线程访问它以进行读取,并且在读取时,其他线程都不应访问它以进行写入。哪个是最佳解决方案,为什么?另外,我将在一个类中使用它,其中有需要编辑的字段变量。请提供您的建议。
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

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


查看完整回答
反对 回复 2022-09-14
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您的两种解决方案都可以工作,但是您在实现锁定的方式中存在一个错误。

首先是两种方法的区别:重入式读写锁定主要用于以下情况:读取次数多于通常为 10 次读取 :1 次写入的写入操作。这允许同时进行读取而不会相互阻塞,但是当写入开始时,所有读取都将被阻止。因此,性能是主要原因。

方法中的错误:要锁定的对象应该是最终的。在 setCount() 中,您有效地交换了对象,这可能会导致此时的脏读。

此外,切勿公开要锁定的对象。要锁定的对象应该是私有的和最终的。原因是,如果您碰巧公开了该对象,则调用方可能会碰巧使用返回的对象本身进行锁定,在这种情况下,您将遇到与此类本身外部的组件的争用问题。


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号