Java线程安全-对方法的多重访问,除非正在使用另一个方法

Java线程安全-对方法的多重访问,除非正在使用另一个方法,java,concurrency,thread-safety,Java,Concurrency,Thread Safety,我正在寻找解决问题的最佳方法: 我有一个贝叶斯模型类,你可以在上面调用classify。我想要尽可能多的线程来访问这个。但是,我有另一种方法可以改变对象的内部结构removeCategory 我是否可以仅在访问removeCategory时阻止线程访问classify 我想我可以通过一个信号量来实现这一点,其中classify获得每个线程1个许可证,而removeCategory获得最大许可证。这样它将阻塞所有线程,直到所有线程都使用classify完成,而另一个线程在许可证被释放之前无法启动c

我正在寻找解决问题的最佳方法:

我有一个贝叶斯模型类,你可以在上面调用
classify
。我想要尽可能多的线程来访问这个。但是,我有另一种方法可以改变对象的内部结构
removeCategory

我是否可以仅在访问
removeCategory
时阻止线程访问
classify

我想我可以通过一个信号量来实现这一点,其中
classify
获得每个线程1个许可证,而
removeCategory
获得最大许可证。这样它将阻塞所有线程,直到所有线程都使用
classify
完成,而另一个线程在许可证被释放之前无法启动
classify
调用


有更好的解决方案吗?

您所描述的本质上是一个解决方案。将您的
classify()
方法视为读取器,将
removeCategory()
方法视为编写器,您将获得所需的行为-类将允许无限量的读取器,但编写器将阻止所有其他(包括其他编写器)

有一个使用这个类的例子(在很多其他地方)