[英]Does Synchronized method synchronized if a Java method is invokded from PLSQL
我想知道是否某个方法不是在Java线程中而是从另一种线程或语言中调用的,例如plsql。
就我而言,plsql没有线程,但是有会话,如果我希望从plsql过程调用的方法可以同步该怎么办。
我的问题是
同步关键字仍然可以正常工作吗
这个调用会创建一个Java线程吗
同步关键字或其他Java并发对象(例如Semaphore,conditionObject)是否仅在Java线程中工作?
从pl / sql调用就像:
language java name 'xxx.xxx.xxx.Engine.execute(
java.lang.Integer,
java.lang.String,
java.sql.Timestamp,
java.sql.Timestamp,
java.lang.Long,
java.lang.Long,
java.lang.Long,
java.lang.Long,
java.lang.Long,
java.lang.Long,
java.lang.Long,
java.lang.Long,
java.lang.String,
java.lang.Long )';
而execute方法是静态方法。
同步关键字仍然可以正常工作吗
如果PL / SQL实际上是在调用Java,则可以,它将调用synchronized
关键字和块等。但是,我怀疑它在不同的JVM中,因此Java代码中的锁与锁定在PL / SQL中。 如果查看进程列表,可能会看到两个JVM实例正在运行。
一种测试方法是调试应用程序,然后在execute(...)
方法中放置一个断点。 如果您在断点处停止,则您在同一个JVM中,否则不行。 要尝试的另一件事是打印ManagementFactory.getRuntimeMXBean().getName()
。 如果这与您的Java客户端代码不同,则它是不同的JVM。
这个调用会创建一个Java线程吗
我怀疑是这样。 我怀疑您的ODBC调用(您在做什么吗?)是使用某种网络连接的Oracle远程过程调用。 然后,将执行Oracle服务器内部的线程,该线程将移交给Java。 我怀疑Java正在另一个线程中运行。
要测试正在运行的线程,可以使用Thread.currentThread().getId()
。 但是,它可能随机相同,因此您还需要比较上面显示的getName()
输出。
同步关键字或其他Java并发对象(例如Semaphore,conditionObject)仅在Java Thread中起作用吗?
我不太明白这个问题。 除非Oracle正在解释Java或其他内容,否则没有进入Java线程的方法就无法执行Java代码。
如果您询问是否在进行Oracle数据库调用的同一个线程中,那么我对此表示怀疑。 往上看。 如果您要问它是否是相同的JVM,那么我会怀疑。 往上看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.