Java并发-公平锁与非公平锁

1.公平锁和非公平锁释放时,最后都要写一个volatile变量的state。

 protected final 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;
        }

2.公平锁获取时,首先会去读volatile变量。

protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

3.非公平锁获取时,首先会用CAS更新volatile变量,这个操作同时具有volatile读和voaltile写的内存语义。

final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

锁释放-获取的内存语义的实现至少有2种:
1.利用volatile变量的写-读所具有的内存语义。
2.利用CAS所附带的volatile读和volatile写的内存语义。

猜你喜欢

转载自blog.csdn.net/qq_29842929/article/details/80875938