如果我使用执行器提交任务,如下所示:
public SomeClass{
public void doSomething(){
Runnable r = new Runnable(){
public void run(){
callSomeMethod();
}
}
executor.execute(r);
}
}
如果callSomeMethod
是,会有什么不同吗
- CCD_ 2的私有方法或
- 以任何方式与并发问题相关的
SomeClass
方法
我指的不是访问变量。
有细微的差异,但对您来说应该无关紧要。
如果callSomeMethod()是私有的并在封闭(外部)类中声明,JVM规范将拒绝匿名Runnable对它的访问(私有方法只对声明类可见。内部类的概念对VM来说是未知的)。但是,根据语言规范,这是一个有效的调用。在这种情况下,java编译器发挥了一些神奇的作用——它生成了一个合成访问器(基本上是一个没有在源代码中声明,但纯粹由编译器生成的方法,以允许访问私有方法)。
对于私有的类成员也是如此。所以严格地说,这是有区别的,它会将生成的类文件放大一点点。
您应该选择在代码可读性方面最合适的形式。Runnable可以被视为方法(以及它的包含类)的一部分,因此如果callSomeMethod()对类声明类是私有的,那么它应该被声明为私有的。
至于callSomeMethod()最好放在哪里,请根据它的目的/作用(逻辑上希望在哪里找到代码执行的操作)来做出决定。
非常抽象地说(这就是你所要求的),没有区别。方法只是一段代码。当线程执行一个方法时,该方法的副本存在于线程的私有堆栈上,而不管代码实际定义在哪里。
访问共享变量和作用域是完全不同的讨论。
如果不访问任何变量,怎么会出现并发问题?