在阅读JSR-133 Cookbook for Compiler Writers关于volatile的实现之后,特别是"与原子指令的交互"部分我认为读取volatile变量而不更新它需要LoadLoad或LoadStore屏障.在页面的下方,我看到LoadLoad和LoadStore在X86 CPU上实际上是无操作的.这是否意味着可以在x86上没有显式缓存失效的情况下完成易失性读取操作,并且正常变量读取速度快(忽略volatile的重新排序约束)?
我相信我不明白这一点.有人可以照顾我吗?
编辑:我想知道多处理器环境是否存在差异.在单CPU系统上,CPU可能会查看它自己的线程缓存,正如John V.所述,但在多CPU系统上,CPU必须有一些配置选项,这是不够的,主内存必须被击中,使得波动较慢在多CPU系统上,对吗?
PS:在我学习更多相关信息的路上,我偶然发现了以下很棒的文章,因为这个问题可能对其他人很有意思,我会在这里分享我的链接:
我有以下参数化的JPA或Hibernate查询:
SELECT entity FROM Entity entity WHERE name IN (?)
Run Code Online (Sandbox Code Playgroud)
我想将参数作为ArrayList <String>传递,这可能吗?Hibernate电流告诉我,那
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
解答:作为参数的集合仅适用于像" :name
" 这样的命名参数,而不适用于像" ?
" 这样的JDBC样式参数.
我目前正在评估JMS,但我没有得到我能用它的东西.
目前,我认为这将是一个Usecase:我想创建一个SalesInvoice PDF并在SalesOrder离开Warehouse时打印它,因此在Delivery事务期间,我可以发送一个事务性打印请求,该请求刚刚在SalesOrder事务成功完成时开始.
现在我发现大多数JMS产品都是独立服务器.
为了加快JVM的启动时间,Sun开发人员决定在安装JVM期间为平台预编译标准运行时类是个好主意.这些预编译的类可以在以下位置找到:
$ JAVA_HOME\jre的\ BIN \客户端\ classes.jsa
我的公司目前开发了一个Java独立应用程序,它带来了自己的JRE,因此通过在这个jsa文件中添加我们自己的应用程序类来加速我们的应用程序启动时间是一个很棒的选择.
我不相信JSA文件是由魔术创建的,所以:它是如何创建的?如何欺骗JVM合并我自己的类?
编辑:我已经发现以下内容:
classes.jsa由命令创建
java -Xshare:dump
Run Code Online (Sandbox Code Playgroud)
可以在中找到要包含在转储中的类列表$JAVA_HOME/jre/lib/classlist
.
我甚至设法在这里添加我自己的类(并将它们添加到rt.jar中以便java找到它们),并在classlist文件下面生成我自己的校验和.
最后一个问题是:只有java,com.sun和org.w3c包中的类似乎被识别,如果我在原始包中保留相同的类,它们将不会被加载.我在整个OpenJDK源代码中搜索了这个指针,但它似乎与保护域有关.如果有人对这个主题感兴趣并且知识渊博,请添加一些指示让我进一步调查.
我想获得PermGen的转储,看看为什么它正在填充.有没有办法分析这个?我已经知道像log4j,tomcat webapp重新加载等常见的嫌疑人,但我的应用程序中也有一些自定义代理生成代码,只是想深入了解.
这有可能吗?
我需要一个日期格式(也许是SimpleDateFormat)来解析我在Date对象上调用toString()时得到的输出的可靠性.我的德语(!)系统的输出是:"Sun Dec 12 13:45:12 CET 2010",所以它似乎并不尊重语言环境,这似乎让它变得简单.
任何人?
我需要将一些数据从PostgreSQL导出到Excel(快速客户希望),以及上次Excel在打开或导入我的COPYd csv文件(行结尾,utf-8编码等)时遇到严重问题,我花了一个小时最好.
有人知道一个生成真实Excel文件的快速,优雅的解决方案吗?像一个小shell脚本或类似?
我希望这可以在我的Linux机箱(Debian 5.0 Lenny)或Windows(XP或更高版本)上完成.
我从我的蚂蚁脚本中调用javac,如下所示:
<javac srcdir="src"
destdir="build/classes" source="1.6"
target="1.6" debug="true" encoding="Cp1252"
nowarn="true">
Run Code Online (Sandbox Code Playgroud)
但它仍然会在输出中抛出编译器警告:
[javac] Compiling 73 source files to C:\IKOfficeRoot\Java\ERP\Framework\build\classes
[javac] C:\IKOfficeRoot\Java\ERP\Framework\src\de\ikoffice\util\LoggerFactory.java:49: warning: sun.reflect.Reflection is Sun proprietary API and may be removed in a future release
[javac] return Logger.getLogger(Reflection.getCallerClass(2));
[javac] ^
[javac] Note: C:\IKOfficeRoot\Java\ERP\Framework\src\de\ikoffice\db\SingleShotResultSet.java uses or overrides a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 1 warning
Run Code Online (Sandbox Code Playgroud)
我也试过了
<compilerarg line="-Xlint:-unchecked -Xlint:-deprecation"/>
Run Code Online (Sandbox Code Playgroud)
和
<compilerarg …
Run Code Online (Sandbox Code Playgroud) 我在Hibernate中使用HQL查询,只是想知道,如果我可以增加我的应用程序重用查询的性能.
通常,您必须为每个会话创建一个新的Query对象:
Session session;
Query q1 = session.createQuery("select a from Article a where id=:id");
q1.setInteger("id",123);
List result = q1.list();
Run Code Online (Sandbox Code Playgroud)
现在我在HQL中有相对复杂的查询,我不想一遍又一遍地解析.有没有办法在另一个会话中创建查询并重用它?像这样:
Session session;
Query q2 = q1.reattach();
q2.setInteger("id",123);
List result = q2.list();
Run Code Online (Sandbox Code Playgroud)
如果Hibernate无论如何都使用预处理语句,这应该是一个值得注意的性能提升,特别是与缓存预准备语句的ConnectionPool结合使用时.
编辑:通常不需要在Hibernate中重用查询,因为无论如何查询计划已经缓存在QueryPlanCache类中.命名查询也不提供任何改进,因为它们仅用于查找查询字符串,并且没有计划与它们相关联.
总结一下:在Hibernate中重用Queries是没有用的.确保始终使用参数化查询,因此请保持计划缓存较小.