我有一个带有静态变量的类,多个线程将有这个类的实例。
我关注的静态变量是Thread
,它将从队列中弹出消息并通过电子邮件发送,直到队列为空。每次将消息添加到队列时,我都会检查线程是否处于活动状态。如果没有,我重启它。
if (mailThread == null)
{
mailThread = new Thread(mailSender);
mailThread.start();
}
else if (!mailThread.isAlive())
{
mailThread = new Thread(mailSender);
mailThread.start();
}
在another question中,有人说静态变量应该在同步块中使用。
我的问题是,如果检查,只使用ReentrantLock
是否安全?或者我需要使用synchronized
吗?或两者兼而有之?
答案 0 :(得分:1)
您可以使用ReentrantLock或同步块。两者都同样安全。虽然在某些情况下性能存在差异。查看以下基准:Benchmark 1 Benchmark 2。
答案 1 :(得分:0)
根据docs:
具有相同基本行为的重入互斥锁定 语义作为使用synchronized访问的隐式监视器锁 方法和语句,但具有扩展功能。一个 ReentrantLock由最后成功锁定的线程拥有,但是 尚未解锁。线程调用锁将成功返回 当锁不是由另一个线程拥有时获取锁。该 如果当前线程已经拥有,则方法将立即返回 锁。这可以使用方法isHeldByCurrentThread()来检查 getHoldCount()。
因此ReentrantLock
必须足够安全。