假设客户有一个 Credit Card
.他的余额为 x
多少钱,他正在购买y
贵重元素 (y<x)
.他又要买另一件女巫的东西了z
.
(y+z>x but z<x
)。
现在我要在Java
中模拟这个场景.如果所有交易都按顺序发生,则无需 panic 。客户可以购买y
贵重元素,然后他没有足够的信用购买其他元素。
但是当我们进入多线程环境时,我们必须处理一些锁定机制或一些策略。因为如果其他线程在反射(reflect)之前线程的更改之前读取信用卡对象,则会出现严重问题。
据我所知,一种方法是我们可以保留原始余额的副本,我们可以在更新余额之前检查当前值。如果值与原始值相同,那么我们可以确保其他线程不会改变余额。如果余额不同,那么我们必须撤消我们的计算。
Java 同步也是一个很好的解决方案。现在我的问题是在这种情况下实现的最佳方法是什么?
此外,如果我们要从大局中看到这一点。同步会影响系统的性能。由于对象被锁定,其他线程必须等待。
最佳答案
我更喜欢有一个ReadWriteLock
,这有助于锁定它以进行读写,这很好,因为您可以为每个资源设置单独的读写锁:
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().lock();
// multiple readers can enter this section
// if not locked for writing, and not writers waiting
// to lock for writing.
readWriteLock.readLock().unlock();
readWriteLock.writeLock().lock();
// only one writer can enter this section,
// and only if no threads are currently reading.
readWriteLock.writeLock().unlock();
ReadWriteLock
内部保留了两个 Lock 实例。一种保护读访问,一种保护写访问。
关于java - Java中对象的锁定机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102626/