gpt4 book ai didi

java - synchronized 是否像 Lock.lock() 那样停放并发线程?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:03 26 4
gpt4 key购买 nike

当我们调用 lock.lock() 或尝试进入一个 synchronized block 时,如果其他线程已经获取了该锁,我们的线程就会阻塞。现在我的问题是,当我们查看 lock.lock() 的实现时,它会将获取锁委托(delegate)给实际上停放当前线程的 AQS(这样它就不能被调度程序进一步调度)。

synchronized 阻塞也是这样吗?

我什至认为我的线程状态也不同。例如,如果我的线程在 synchronized block 上被阻塞,它将是 BLOCKING 而如果我调用lock.lock(),那么它将是WAITING。我说得对吗?

我关心的是以下两种锁定策略在Thread.status方面的区别以及通过停放而不是忙等待来提高性能

  1. ReentrantLock.lock();
  2. 同步 {/*一些代码 */}

最佳答案

BLOCKING - 在资源上被阻塞,不能被中断

WAITING - 被资源阻止,但可以被中断或通知或取消停放。

如您所见,WAITING 更适合来自另一个进程的控制。例如如果两个线程死锁,你可以用中断来打破 lock() 。对于使用同步的双线程,您会被卡住。

synchronized 与 lock 的行为非常相似,主要修订之间的确切细节有所不同。

我的建议是使用

  • 同步用于需要线程安全但锁争用非常低的更简单的代码。

  • 在您确定存在锁争用或需要其他功能(如 tryLock)的地方使用 Lock。


如果你这样做

final Lock lock = new ReentrantLock();
lock.lock();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
lock.lockInterruptibly();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(100);
System.out.println(t + " is " + t.getState());
lock.unlock();

打印

Thread[Thread-0,5,main] is WAITING

Thread.State


等待线程的线程状态。由于调用以下方法之一,线程处于等待状态:

  • Object.wait 没有超时
  • Thread.join 没有超时
  • LockSupport.park

处于等待状态的线程正在等待另一个线程执行特定的操作。例如,已对某个对象调用 Object.wait() 的线程正在等待另一个线程对该对象调用 Object.notify() 或 Object.notifyAll()。已调用 Thread.join() 的线程正在等待指定线程终止。

关于java - synchronized 是否像 Lock.lock() 那样停放并发线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17233599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com