ReentrantLock是否足够安全,以保护对静态变量的多线程访问?

3
我有一个带有静态变量的类,多个线程将拥有该类的实例。
我关心的静态变量是一个名为Thread的变量,它将从队列中弹出消息并通过电子邮件发送,直到队列为空。每次添加消息到队列时,我都会检查线程是否仍在运行。如果没有,我会重新启动它。
if (mailThread == null)
{
    mailThread = new Thread(mailSender);
    mailThread.start();
}
else if (!mailThread.isAlive())
{
    mailThread = new Thread(mailSender);
    mailThread.start();
}

另一个问题中,有人说应该在同步块内使用静态变量。

我的问题是,如果只用ReentrantLock进行这些if检查,是否安全?还是我需要使用synchronized?或者两个都需要?


我检查线程是否仍在运行。如果没有,我会重新启动它。感谢您考虑可用性,但如果您希望线程始终可用,则更好的策略是编写一个永不死亡的线程。(我假设这个mailThread不执行任何外部代码。如果你确实需要执行外部代码,最好将其隔离到自己的独立进程中。) - Solomon Slow
2个回答

1

你可以使用ReentrantLock或同步块。两者都同样安全。虽然在某些情况下性能有所不同。查看这些基准测试:Benchmark 1 Benchmark 2


0
根据文档

可重入互斥锁与使用同步方法和语句访问的隐式监视器锁具有相同的基本行为和语义,但具有扩展功能。ReentrantLock由最后成功锁定但尚未解锁它的线程拥有。当锁不被其他线程拥有时,调用lock的线程将返回并成功获取锁。如果当前线程已经拥有锁,则该方法将立即返回。可以使用isHeldByCurrentThread()和getHoldCount()方法来检查这一点。

因此,ReentrantLock必须足够安全。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接