公平锁与非公平锁

所谓公平锁指的是哪个线程先运行,那就可以先得到锁。非公平锁是不管线程是否是先运行,都是随机获得锁的。

公平锁与非公平锁

公平锁是一个新的线程想要得到一个锁,这时候不论锁是否已经被占有了,都要先把自己加到等待队列中,然后等队列前面的线程都处理完以后,自己才能得到锁。严格按照线程启动的顺序来执行的,不允许其他线程插队执行的

static final class FairSync extends Sync {

final void lock() {

acquire(1);

}

}

非公平锁是当一个新的线程想要得到一个锁,而这时锁恰好没有被别的线程占有,那么这时候这个新的线程就可以无视其他线程在等待队列中的排队,而直接获取这个锁,而且不用先加入等待队列。允许插队的。

static final class NonfairSync extends Sync {

final void lock() {

if (compareAndSetState(0, 1))

setExclusiveOwnerThread(Thread.currentThread());

else

acquire(1);

}

}

ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync

公平锁与非公平锁

默认状态,使用的ReentrantLock()就是非公平锁。

public ReentrantLock() {

sync = new NonfairSync();

}

更多内容请关注每日编程,每天进步一点。


分享到:


相關文章: