Java 1.4 中 Lock.tryLock() 的替代方案

问题描述 投票:0回答:1

我想知道是否有现有的替代方案,或者如何在 Java 5 之前实现 java.util.concurrent.locks.Lock#tryLock() 的语义。如果锁被锁定,则可以立即退出。已被另一个线程持有。

java multithreading concurrency synchronization
1个回答
4
投票

如果您需要

Lock
支持
tryLock
操作,则不能使用 Java 的内在锁定功能。您必须实现自己的
Lock
类,该类维护所需的状态,即所有者
Thread
和计数器,并且可能使用内在锁定来实现线程安全更新和阻塞(旧版本中没有太多替代方案) Java 版本)。

一个非常简单的实现可能如下所示:

public final class Lock {
    private Thread owner;
    private int nestCount;
    
    public synchronized void lock() throws InterruptedException {
        for (;;) {
            if (tryLock()) return;
            wait();
        }
    }
    
    public synchronized boolean tryLock() {
        Thread me = Thread.currentThread();
        if (owner != me) {
            if (nestCount != 0) return false;
            owner = me;
        }
        nestCount++;
        return true;
    }
    
    public synchronized void unlock() {
        if (owner != Thread.currentThread())
            throw new IllegalMonitorStateException();
        if (--nestCount == 0) {
            owner = null;
            notify();
        }
    }
}

请注意,由

Lock
方法强制执行的
synchronized
实例的内在锁仅保持很短的时间。线程将立即返回或进入
wait
状态,这意味着也释放锁。因此,
tryLock
将表现出所需的行为,尽管 Java 5 和更新的等效版本可能会更高效。 (Java 5 和更新的
synchronized
实现也更高效……)

© www.soinside.com 2019 - 2024. All rights reserved.