Java:有没有办法让一个(库的)类只能被一个特定的线程访问?

时间:2016-09-21 04:16:00

标签: java multithreading restriction

一次不允许一个线程,而只允许一个特定线程。

这不是我可以访问的类(我实际上想避免创建一个fork),或者我可以使用this,尽管我认为jRat可能会做什么可以用来自动化这种方法关于我们不想分叉的课程。

所以,有一个main()线程,一切都开始了,我想防止特定类的所有对象的所有方法和字段被任何其他线程修改,如果发生这种情况则抛出异常/崩溃。

主线程时,这些对象必须保持不变(它的字段值)。

你会怎么做?如果它真的可能的话。

1 个答案:

答案 0 :(得分:1)

如果您尝试为某种调试/测试目的实现此目的,我建议如下。

在Java中,使用AOP拦截(通过编写拦截器)对库类的公共/私有函数的所有调用(Spring examples - http://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with-examples)。在拦截器类中,维护有关访问截获方法的线程(TID)的信息。现在,因为你的拦截器在库函数之前和之后被调用,如果一个线程调用库函数而另一个线程仍在执行库函数,你可以选择抛出异常。

例如 -

1)你可以维持一个原子整数" tid"在最初设置为0的拦截器类中,当一个线程调用库函数时,拦截器在调用库函数之前获得控制权。 2)此时尝试比较并设置变量" tid"。 3)执行库函数后,再次将该值设置为0。

如果在步骤2中比较和设置失败,则可以抛出异常。

此解决方案将受到一些限制,具体取决于被拦截的对象。

另一种方法是在有问题的库类上编写一个包装器并使其成为不可变的。