首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中是否存在一种快速失败的同步方式?

Java 中存在一种快速失败的同步方式,即 tryLocktryLock 是一种非阻塞的锁,如果锁可用,则获取它并立即返回 true;如果锁不可用,不会造成当前线程阻塞,而是返回 false。如果希望获取锁,可以立即在 tryLockcatch 块中再次尝试获取锁,这样可以在发生异常时快速失败,提高并发效率。

代码语言:java
复制
public void transfer(Account fromAccount, Account toAccount, double amount) {
    boolean hasLocks = false;
    while (!hasLocks) {
        if (fromAccount.getLock().tryLock()) {
            try {
                if (toAccount.getLock().tryLock()) {
                    try {
                        fromAccount.withdraw(amount);
                        toAccount.deposit(amount);
                        hasLocks = true;
                    } finally {
                        toAccount.getLock().unlock();
                    }
                }
            } finally {
                fromAccount.getLock().unlock();
            }
        }
        // 等待一段时间然后重试
        if (!hasLocks) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

需要注意的是,tryLock 方法在处理一些异常情况(如:锁被其他线程持有)时仍然有局限性。更强大的同步工具可以考虑使用 ReentrantLockSemaphore,它们提供了更丰富的功能,如超时、支持 fair/unfair 锁等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 伴鱼实时计算平台 Palink 的设计与实现

    在伴鱼发展早期,出现了一系列实时性相关的需求,比如算法工程师期望可以拿到用户的实时特征数据做实时推荐,产品经理希望数据方可以提供实时指标看板做实时运营分析。这个阶段中台数据开发工程师主要是基于「Spark」实时计算引擎开发作业来满足业务方提出的需求。然而,这类作业并没有统一的平台进行管理,任务的开发形式、提交方式、可用性保障等也完全因人而异。 伴随着业务的加速发展,越来越多的实时场景涌现出来,对实时作业的开发效率和质量保障提出了更高的要求。为此,我们从去年开始着手打造伴鱼公司级的实时计算平台,平台代号「Pa

    01
    领券