传统的Synchronized锁
Synchronized 通过为方法或代码块添加互斥锁,来保证线程安全性。 持有相同锁的多个线程,同一时间只有一个线程能够拿到锁并执行锁定的代码块或方法。
public synchronized void run(){ // do something }
Lock锁
接口Lock的实现类:
- ReentractLock
- ReentractReadWriteLock.ReadLock
- ReentractReadWriteLock.WriteLock
public void run(){
lock.lock();
try{
// do something
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
非公平锁
非公平锁(Unfair Lock)是一种线程同步机制,与公平锁(Fair Lock)相对应。在多线程环境中,公平锁会按照线程的申请顺序来获取锁资源,即先到先得的原则。而非公平锁则不考虑线程的申请顺序,允许新来的线程插队获取锁资源,从而可能导致已经在等待的线程长期等待。
非公平锁的设计主要是为了提高系统的整体吞吐量和性能。由于公平锁要求按照申请顺序获取锁资源,如果一个线程获取锁资源的时间较长,那么其他已经准备好并且在等待的线程就必须一直等待。这样会导致线程频繁地从用户态和内核态之间切换,增加了上下文切换的开销,降低了系统的吞吐量。
相比之下,非公平锁允许新来的线程插队获取锁资源,避免了等待时间过长的情况,减少了线程的等待时间和上下文切换的开销,从而提高了系统的整体性能和吞吐量。然而,由于非公平锁的设计特点,可能会导致某些线程一直无法获取到锁资源,造成不公平现象。
选择使用公平锁还是非公平锁需要根据具体的场景和需求来决定。如果对线程的公平性要求较高,并且能够容忍一定的性能损失,可以选择公平锁。如果追求系统的整体性能和吞吐量,并且能够接受一些线程的不公平性,可以选择非公平锁。
Synchronized 和 Lock 的区别
https://xie.infoq.cn/article/4e370ded27e4419d2a94a44b3
标签:Java,Synchronized,Lock,笔记,获取,线程,公平,lock From: https://www.cnblogs.com/Bota5ky/p/17420613.html