只是想知道以下执行相同功能的代码有何不同代码 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 将只允许一个线程。但是,当他们都尝试阅读计数时,每个人都可以获得计数的值。

蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
您的两种解决方案都可以工作,但是您在实现锁定的方式中存在一个错误。
首先是两种方法的区别:重入式读写锁定主要用于以下情况:读取次数多于通常为 10 次读取 :1 次写入的写入操作。这允许同时进行读取而不会相互阻塞,但是当写入开始时,所有读取都将被阻止。因此,性能是主要原因。
方法中的错误:要锁定的对象应该是最终的。在 setCount() 中,您有效地交换了对象,这可能会导致此时的脏读。
此外,切勿公开要锁定的对象。要锁定的对象应该是私有的和最终的。原因是,如果您碰巧公开了该对象,则调用方可能会碰巧使用返回的对象本身进行锁定,在这种情况下,您将遇到与此类本身外部的组件的争用问题。
添加回答
举报
0/150
提交
取消