3

我有一个带有静态变量的类,并且多个线程将具有该类的实例。

我关心的静态变量是 a Thread,它将从队列中弹出一条消息并通过电子邮件发送,直到队列为空。每次将消息添加到队列时,我都会检查线程是否处于活动状态。如果没有,我重新启动它。

if (mailThread == null)
{
    mailThread = new Thread(mailSender);
    mailThread.start();
}
else if (!mailThread.isAlive())
{
    mailThread = new Thread(mailSender);
    mailThread.start();
}

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

我的问题是,将 aReentrantLock用于这些 if 检查是否安全?还是我需要使用synchronized?或两者?

4

2 回答 2

1

您可以使用 ReentrantLock 或同步块。两者同样安全。尽管在某些情况下性能存在差异。查看这些基准:基准 1 基准 2

于 2016-02-21T12:19:22.877 回答
0

根据文档

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

所以ReentrantLock必须足够安全。

于 2016-02-21T12:14:33.253 回答