Java Lock 锁如何实现公平锁和非公平锁

发布时间:2025-02-09 02:08:10 作者:小樊
来源:亿速云 阅读:144

Java中的Lock接口提供了两种锁:公平锁(Fair Lock)和非公平锁(Unfair Lock)。公平锁意味着等待时间最长的线程将获得锁,而非公平锁则不保证这一点。这两种锁的实现方式如下:

  1. 公平锁(Fair Lock):

Java中的ReentrantLock类可以通过构造函数参数设置为公平锁。当设置为公平锁时,等待时间最长的线程将获得锁。为了实现公平锁,我们需要自定义一个队列来存储等待获取锁的线程。以下是一个简单的公平锁实现示例:

import java.util.concurrent.locks.AbstractOwnableSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class FairLock implements Lock {
    private final AbstractOwnableSynchronizer synchronizer = new AbstractOwnableSynchronizer() {
        @Override
        protected boolean tryAcquire(int acquires) {
            Thread currentThread = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors()) {
                    setState(c + acquires);
                    return true;
                }
            } else if (currentThread == getExclusiveOwnerThread()) {
                setState(c + acquires);
                return true;
            }
            return false;
        }

        @Override
        protected boolean tryRelease(int releases) {
            int c = getState() - releases;
            if (Thread.currentThread() != getExclusiveOwnerThread()) {
                throw new IllegalMonitorStateException();
            }
            boolean free = false;
            if (c == 0) {
                free = true;
                setExclusiveOwnerThread(null);
            }
            setState(c);
            return free;
        }

        @Override
        protected Condition newCondition() {
            return null;
        }
    };

    @Override
    public void lock() {
        synchronizer.acquire(1);
    }

    @Override
    public void unlock() {
        synchronizer.release(1);
    }

    @Override
    public boolean isLocked() {
        return synchronizer.isHeldExclusively();
    }

    @Override
    public boolean isHeldByCurrentThread() {
        return synchronizer.getExclusiveOwnerThread() == Thread.currentThread();
    }
}
  1. 非公平锁(Unfair Lock):

Java中的ReentrantLock类默认实现为非公平锁。在非公平锁中,等待时间最长的线程不一定能获得锁。以下是一个简单的非公平锁实现示例:

import java.util.concurrent.locks.AbstractOwnableSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

public class UnfairLock implements Lock {
    private final AbstractOwnableSynchronizer synchronizer = new AbstractOwnableSynchronizer() {
        @Override
        protected boolean tryAcquire(int acquires) {
            Thread currentThread = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors()) {
                    setState(c + acquires);
                    return true;
                }
            } else if (currentThread == getExclusiveOwnerThread()) {
                setState(c + acquires);
                return true;
            }
            return false;
        }

        @Override
        protected boolean tryRelease(int releases) {
            int c = getState() - releases;
            if (Thread.currentThread() != getExclusiveOwnerThread()) {
                throw new IllegalMonitorStateException();
            }
            boolean free = false;
            if (c == 0) {
                free = true;
                setExclusiveOwnerThread(null);
            }
            setState(c);
            return free;
        }

        @Override
        protected Condition newCondition() {
            return null;
        }
    };

    @Override
    public void lock() {
        synchronizer.acquire(1);
    }

    @Override
    public void unlock() {
        synchronizer.release(1);
    }

    @Override
    public boolean isLocked() {
        return synchronizer.isHeldExclusively();
    }

    @Override
    public boolean isHeldByCurrentThread() {
        return synchronizer.getExclusiveOwnerThread() == Thread.currentThread();
    }
}

请注意,这里的公平锁和非公平锁实现仅作为示例,实际生产环境中建议使用Java内置的ReentrantLock类。

推荐阅读:
  1. 详解Java如何实现线程同步
  2. Java中线程公平锁和非公平锁的区别是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:ReentrantLock 和 synchronized 哪个性能更好

下一篇:如何使用 Java Lock 锁避免死锁

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》