Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可重入锁是否足够安全,以保护对静态变量的多线程访问_Java_Multithreading_Synchronized_Static Members_Reentrantlock - Fatal编程技术网

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
不执行任何外来代码。如果您确实需要执行外来代码,您最好在它自己的单独进程中对其进行沙箱处理。)