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

时间:2016-02-21 11:57:59

标签: java multithreading synchronized static-members reentrantlock

我有一个带有静态变量的类,多个线程将有这个类的实例。

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

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

another question中,有人说静态变量应该在同步块中使用。

我的问题是,如果检查,只使用ReentrantLock是否安全?或者我需要使用synchronized吗?或两者兼而有之?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

根据docs

  

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

因此ReentrantLock必须足够安全。