java - Java中对象的锁定机制

标签 java multithreading

假设客户有一个 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/

相关文章:

java - 编程风格 : Try Catch and External Dependents

Python : 2 sockets, 从 A 发送到 B,从 B 发送到 A

multithreading - 有没有一种方法可以检测QT QRunnable对象何时完成?

android - 如何在不阻塞的情况下等待 Android UI 线程中异步填充的对象?

java - log4j - 将 System.out 和 System.err 同时记录到控制台

java - 阻止用户输入特殊字符

java - 如何在使用 documentBuilderFactory 解析时管理 xml 中的嵌套循环

java - android:如何将LinkedHashMap发送到不固定大小的URL

python - 使用多处理和 ssdeep Python 对相似文件进行分组时出现问题

c - pthread_cond_wait() 实际上是如何工作的?