我想创建一个应该在其他会话中共享的工作线程。基本上我想限制其他用户执行相同的过程。所以他们会通过我创建的对象线程的静态实例来检索线程。如果线程仍然存在,则会提示错误。线程对象可以设置为静态变量
有没有其他的方式来做到这一点,因为我想如果将一个线程对象放在一个静态是安全的?我也在考虑应用程序上下文,但我不确定哪种方法可以在java中执行此操作?
我想创建一个应该在其他会话中共享的工作线程。基本上我想限制其他用户执行相同的过程。所以他们会通过我创建的对象线程的静态实例来检索线程。如果线程仍然存在,则会提示错误。线程对象可以设置为静态变量
有没有其他的方式来做到这一点,因为我想如果将一个线程对象放在一个静态是安全的?我也在考虑应用程序上下文,但我不确定哪种方法可以在java中执行此操作?
将任何对象放置在静态或任何类型的共享位置中都不是本质上不安全的,但您需要注意设计。
声明
static Thing t;
初始化
if (t == null) {
t = new Thing();
}
使用
t.dosomething();
现在会发生什么,如果两个线程在同一时间击中INITIALISE块?你可以得到两件创造的东西。可能不希望这样,所以使用同步。
synchronized void intialise() {
if (t == null) {
t = new Thing();
}
}
如果两个线程同时尝试使用t,会发生什么情况。这取决于Thing所做的承诺。如果是线程安全没有问题,否则你的代码需要提供同步
synchronized void doSomthing() {
t.doSomething();
}
我会为您设置的静态字段使用锁,以避免两个任务启动进程的可能性。您可以存储线程,以便知道何时完成,或者AtomicBoolean在运行时标记。 (您也可以锁定)
因此,将线程存储为静态是否安全?我的意思是,如果我存储会话,则其他会话无法访问。 – Nap
其安全提供线程安全。然而,这不是正常的做法,值得评论为什么这样做。 –
Can Thing be =线程对象? – Nap
事情可能是任何事情,没有什么特别的线程对象。 – djna