GVKun编程网logo

java – System.exit在Linux上不是线程安全的吗?(java system.in.readline)

8

本文的目的是介绍java–System.exit在Linux上不是线程安全的吗?的详细情况,特别关注javasystem.in.readline的相关信息。我们将通过专业的研究、有关数据的分析等多种方

本文的目的是介绍java – System.exit在Linux上不是线程安全的吗?的详细情况,特别关注java system.in.readline的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解java – System.exit在Linux上不是线程安全的吗?的机会,同时也不会遗漏关于Axis2生成的存根是线程安全的吗?、errno 是线程安全的吗?、errno是线程安全的吗?、Go bytes.Buffer是线程安全的吗?的知识。

本文目录一览:

java – System.exit在Linux上不是线程安全的吗?(java system.in.readline)

java – System.exit在Linux上不是线程安全的吗?(java system.in.readline)

我刚刚从Oracle JDK 1.6切换到Open JDK 1.7.0_03,并且在退出时遇到了相当显着的死锁:

java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 at java.lang.Thread.join(Thread.java:1258)
 - locked <0x8608dda0> (a sun.awt.X11.XToolkit$1$1)
 at java.lang.Thread.join(Thread.java:1332)
 at java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106)
 at java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
 at java.lang.Shutdown.runHooks(Shutdown.java:123)
 at java.lang.Shutdown.sequence(Shutdown.java:167)
 at java.lang.Shutdown.exit(Shutdown.java:212)
 - locked <0x8603df28> (a java.lang.class for java.lang.Shutdown)
 at java.lang.Runtime.exit(Runtime.java:107)
 at java.lang.System.exit(System.java:960)

您似乎必须从AWT事件队列中调用System.exit.这是真的吗? Sun docs Runtime.exit中没有线程要求的文档

我遇到了其他令人惊讶的情况,只有在Linux上才能获得AWT树锁,但是这个需要蛋糕.这是一个错误,还是我错过了文档中的内容?

最佳答案
这取决于,runHooks方法将启动通过Runtime.addShutdownHook注册的任何钩子线程并等待它们完成.如果你的任何钩子线程都锁定了AWT事件线程所需的一些资源,它们可能会导致死锁.

如果你必须在你的AWT事件线程中调用System.exit,我建议你在另一个线程中调用它:

 new Thread(){
            public void run() {
                System.exit(0);
            }
   }.start();

Axis2生成的存根是线程安全的吗?

Axis2生成的存根是线程安全的吗?

Axis2从WSDL生成的客户端存根是否是线程安全的?

当然,“线程安全”并不是严格定义的术语,因此我至少对以下内容感兴趣:

同一个存根类的 不同 实例是否可以由不同线程同时访问,并且具有与单线程执行相同的有效行为?

同一存根类的 单个 实例是否可以由不同的线程并发地以相同的有效行为与相同的调用以某种任意方式在单线程执行中交织在一起?

您可能还希望使用这里描述的术语(和起源于此)来更精确地进行讨论。

答案1

小编典典

我不确定axis2,但是至少axis1会生成非线程安全的客户端存根。我给其他SOAP客户端几乎都是非线程安全的印象。如果我没记错的话,问题是客户端存根以非线程安全的方式使用XML解析库。

但是,使用apache commons-pooling合并实例并一次使用一个线程中的每个实例效果很好。

更新:对于Axis2,请参阅https://issues.apache.org/jira/browse/AXIS2-4357(声称Axis2并非出于线程安全原因,设计使然)

errno 是线程安全的吗?

errno 是线程安全的吗?

errno.h中,这个变量被声明为extern int errno;所以我的问题是,errno在一些调用后检查值是否安全或在多线程代码中使用
perror() 是否安全。这是一个线程安全变量吗?如果没有,那还有什么替代方案?

我在 x86 架构上使用带有 gcc 的 linux。

答案1

小编典典

是的,它是线程安全的。在 Linux 上,全局 errno 变量是线程特定的。POSIX 要求 errno 是线程安全的。

见http://www.unix.org/whitepapers/reentrant.html

在 POSIX.1 中,errno
被定义为外部全局变量。但是这个定义在多线程环境中是不可接受的,因为它的使用会导致不确定的结果。问题是两个或多个线程可能会遇到错误,都会导致设置相同的
errno。在这些情况下,一个线程可能会在它已经被另一个线程更新后检查 errno。

为了规避由此产生的不确定性,POSIX.1c 将 errno 重新定义为可以访问每个线程错误号的服务,如下所示(ISO/IEC
9945:1-1996,搂2.4):

某些函数可能会在通过符号 errno 访问的变量中提供错误号。符号 errno 是通过包含标头来定义的,如 C
标准所规定的……对于进程的每个线程,errno 的值不应受到函数调用或其他线程对 errno 的分配的影响。

另见http://linux.die.net/man/3/errno

errno 是线程本地的;在一个线程中设置它不会影响它在任何其他线程中的值。

errno是线程安全的吗?

errno是线程安全的吗?

在中errno.h,此变量被声明为extern int errno;是我的问题,errno在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢?

我在x86体系结构上将Linux与gcc一起使用。

Go bytes.Buffer是线程安全的吗?

Go bytes.Buffer是线程安全的吗?

在Go编程语言中,bytes.Buffer线程安全吗?AFAIK,其文档未提及线程安全性。

答案1

小编典典

没有。

Go文档遵循一个简单的规则:如果未明确声明并发访问某事是安全的,则不是。

我们今天的关于java – System.exit在Linux上不是线程安全的吗?java system.in.readline的分享已经告一段落,感谢您的关注,如果您想了解更多关于Axis2生成的存根是线程安全的吗?、errno 是线程安全的吗?、errno是线程安全的吗?、Go bytes.Buffer是线程安全的吗?的相关信息,请在本站查询。

本文标签: