Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当不同的线程访问一个静态方法时,该方法中声明的对象是本地的还是在java中共享的_Java_Concurrency - Fatal编程技术网

当不同的线程访问一个静态方法时,该方法中声明的对象是本地的还是在java中共享的

当不同的线程访问一个静态方法时,该方法中声明的对象是本地的还是在java中共享的,java,concurrency,Java,Concurrency,当不同的线程访问一个静态方法时,该方法中声明的对象是本地的还是在java中的线程之间共享的 另外,在执行i/o的线程上调用thread.interrupt()是否安全?静态方法中声明的对象不会在线程之间共享。在方法之外定义为静态的对象是共享的 因此: 如果要在执行I/O的线程上调用interrupt(),则应该考虑使用实现的类。静态方法中声明的变量不会在线程之间共享。当静态方法不修改任何静态或其他共享对象时,它是线程安全的——这意味着多个线程可以调用该方法,不会发生任何不好的情况 ,当中断一个线

当不同的线程访问一个静态方法时,该方法中声明的对象是本地的还是在java中的线程之间共享的


另外,在执行i/o的线程上调用
thread.interrupt()
是否安全?

静态
方法中声明的对象不会在线程之间共享。在方法之外定义为
静态
的对象是共享的

因此:


如果要在执行I/O的线程上调用
interrupt()
,则应该考虑使用实现的类。

静态方法中声明的变量不会在线程之间共享。当静态方法不修改任何静态或其他共享对象时,它是线程安全的——这意味着多个线程可以调用该方法,不会发生任何不好的情况

,当中断一个线程时,很多事情都会出错。但似乎没有线程调用,静态方法就是其中之一。我可能错了。

关于中断()-->

这取决于如何处理IO线程上的中断。不管名称如何,interrupt()只不过是将中断消息传递给给定的线程。这并不意味着要尽快停止运行。接收线程将看到此消息并引发InterruptedException。那么它将如何应对这种情况完全取决于它的能力。它可以选择忽略它,重新启动自己,关闭,等等


当你需要告诉另一个线程一些基本的东西已经改变,当前的执行上下文可能不再有效、不可取、不可能或者你需要的任何东西时,通常会使用中断。

正确的答案是:静态与非静态,这无关紧要

局部变量始终是方法调用的局部变量,无论方法是否是静态的。它们在堆栈上分配,并在方法退出后弹出堆栈(且不可引用)

至于你的第二个问题,请阅读文档


如果您使用的是非阻塞IO,那么调用
中断()
可能有意义,具体取决于您的预期(同样,请阅读文档)。如果正在执行阻塞IO,则调用
interrupt()
将无效。

在正在执行I/O的线程上调用
thread.interrupt()
是安全的,只要I/O是在一个线程上完成的

如果该线程在可中断通道上的I/O操作中被阻塞,那么该通道将被关闭,线程的中断状态将被设置,线程将收到ClosedByInterruptException

依照

当不同线程访问静态方法时,是否在中声明对象 在java中,该方法是本地的还是线程间共享的


任何方法中声明的对象都是该方法的本地对象。无论方法是静态的还是其他的,都没有任何区别。

在静态或非静态方法中声明的变量不会在不同的线程之间共享。

这是两个独立的问题,应该在两篇单独的帖子中提出。调用thread.interrupt on threads在静态方法中执行io仍然是两个独立的问题问题。
静态
与此无关。
private static Object thisIsShared;

public static void myMethod() {
    Object thisIsNotShared = new Object();
}