rou*_*ble 0 java multithreading design-patterns thread-safety
我正在编写一个类(Foo),当实例化时,可以从多个线程调用它.
Foo类的大多数方法可以由多个线程并行安全地调用.此类的一个方法(logout())要求完成所有其他线程.
在调用logout之前,将从线程安全集合中删除对foo的引用.因此,没有新线程会获得对Foo对象的引用.但是,可能存在正在处理对需要注销的Foo对象的引用的现有线程.
我可以有一个计数器,每次线程进入对象时递增,并在每次线程离开时递减.在logout()中,我可以旋转while(counter!= 0);
但我认为可能有一个更好的定义方式/模式来做到这一点.在这里寻找stackoverflow社区的智慧.
如果你只想让logout()方法阻塞直到完成所有线程,你可以使用Object.wait()和Object.notify()方法,如下所示:
public class Foo {
private long threadCount;
public synchronized void enter() {
threadCount++;
}
public synchronized void exit() {
threadCount--;
notifyAll();
}
public synchronized void doStuff() {
...
}
public synchronized void logout() {
while(threadCount > 0) {
try {
wait();
} catch (InterruptedException e) {
...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对wait()的调用将阻塞,直到另一个线程调用该对象上的notify()或notifyAll().在这种情况下,logout方法将wait()直到线程计数达到零,并且当每个线程完成并调用done()时,它会通知任何阻塞线程计数已更改.
编辑:刚才意识到你需要为线程进入/退出对象提供单独的方法.