java检测对象中没有其他线程

rou*_*ble 0 java multithreading design-patterns thread-safety

我正在编写一个类(Foo),当实例化时,可以从多个线程调用它.

Foo类的大多数方法可以由多个线程并行安全地调用.此类的一个方法(logout())要求完成所有其他线程.

在调用logout之前,将从线程安全集合中删除对foo的引用.因此,没有新线程会获得对Foo对象的引用.但是,可能存在正在处理对需要注销的Foo对象的引用的现有线程.

我可以有一个计数器,每次线程进入对象时递增,并在每次线程离开时递减.在logout()中,我可以旋转while(counter!= 0);

但我认为可能有一个更好的定义方式/模式来做到这一点.在这里寻找stackoverflow社区的智慧.

Jar*_*ell 5

如果你只想让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()时,它会通知任何阻塞线程计数已更改.

编辑:刚才意识到你需要为线程进入/退出对象提供单独的方法.