Java 可重入锁是否足够安全,以保护对静态变量的多线程访问
我有一个带有静态变量的类,多个线程将有这个类的实例 我关心的静态变量是一个Java 可重入锁是否足够安全,以保护对静态变量的多线程访问,java,multithreading,synchronized,static-members,reentrantlock,Java,Multithreading,Synchronized,Static Members,Reentrantlock,我有一个带有静态变量的类,多个线程将有这个类的实例 我关心的静态变量是一个线程,它将从队列中弹出消息并在电子邮件中发送,直到队列为空。每次将消息添加到队列时,我都会检查线程是否处于活动状态。如果没有,我重新启动它 if (mailThread == null) { mailThread = new Thread(mailSender); mailThread.start(); } else if (!mailThread.isAlive()) { mailThread =
线程
,它将从队列中弹出消息并在电子邮件中发送,直到队列为空。每次将消息添加到队列时,我都会检查线程是否处于活动状态。如果没有,我重新启动它
if (mailThread == null)
{
mailThread = new Thread(mailSender);
mailThread.start();
}
else if (!mailThread.isAlive())
{
mailThread = new Thread(mailSender);
mailThread.start();
}
在中,据说静态变量应该在同步块中使用
我的问题是,对于这些if检查,只使用ReentrantLock
安全吗?或者我需要使用同步
?或者两者都有?根据:
具有相同基本行为和特性的可重入互斥锁
使用synchronized访问隐式监视器锁时的语义
方法和语句,但具有扩展功能。A.
ReentrantLock由上次成功锁定的线程拥有,但
还没有解锁。调用锁的线程将成功返回
当锁不属于另一个线程时,获取锁。这个
如果当前线程已经拥有
锁可以使用方法isHeldByCurrentThread()和
getHoldCount()
因此,
ReentrantLock
必须足够安全。您可以使用ReentrantLock或同步块。两者都同样安全。尽管在某些情况下表现有所不同。检查这些基准:.…我检查线程是否处于活动状态。如果没有,我重新启动它+1用于考虑可用性,但如果希望线程始终可用,更好的策略是编写永不消亡的线程。(我假设这个mailThread
不执行任何外来代码。如果您确实需要执行外来代码,您最好在它自己的单独进程中对其进行沙箱处理。)