在Java Concurrency In Practice一书中,我们被告知可以通过编译器,JVM在运行时甚至由处理器重新排序程序的指令.因此,我们应该假设执行的程序不会以与我们在源代码中指定的顺序完全相同的顺序执行其指令.
但是,讨论Java内存模型的最后一章提供了一个先前发生的规则列表,指出了JVM保留了哪些指令排序.这些规则中的第一条是:
我相信"程序顺序"是指源代码.
我的问题:假设这个规则,我想知道什么指令可能实际重新排序.
"行动"定义如下:
Java内存模型是根据操作指定的,包括对变量的读取和写入,监视器的锁定和解锁,以及启动和连接线程.JMM定义了在程序中的所有操作之前调用的部分排序.为了保证执行动作B的线程可以看到动作A的结果(A和B是否出现在不同的线程中),必须在A和B之间的关系之前发生.在没有发生之前在两个之间进行排序操作,JVM可以随意重新排序.
其他提到的订单规则是:
在将源代码传递给编译器之前,我想在编译时转换 java源代码.换句话说,我想创建一个能够转换的预处理器
"bla bla bla"
Run Code Online (Sandbox Code Playgroud)
进入任何其他代码,如:
new MyClass("bla", 3)
Run Code Online (Sandbox Code Playgroud)
我的实际动机是进行字符串加密,如此处所述
有些人建议编写自定义注释处理器,但据我理解注释:
有些人建议使用Spoon或ObjectsWeb ASM等框架,但这些框架在现有代码库中学习和部署似乎很复杂.
我茁壮成长为两种方法找到一个简单的java代码预处理示例.
有没有人看到任何聪明的方法进行代码转换,而没有用多个常春藤模块完全改变现有的大型代码库?注释似乎是最好的方法,但我不明白该怎么做.
问题
我正在尝试与Phoenix建立二级索引.索引创建需要几个小时.这似乎是由于HBase扫描速度慢,因为我注意到以下性能:
使用HBase shell和Java扫描程序.
注意:GET(通过rowkey)操作实现了良好的性能(约0.5秒).
上下文
故障排除
基于HBase书籍(http://hbase.apache.org/book.html#performance),这是我已经检查过的内容:
1)硬件
2)JVM
3)数据
4)HBase配置
大多数配置保持不变.
一些对我来说看起来不错的params
尝试以下配置更改而不会对性能产生任何影响
5)日志没有任何用处
cat hbase-hbase-master-cox.log …
我从apt工具页面读到,可以创建AnnotationProcessors来生成新的派生文件(源文件,类文件,部署描述符等).我正在寻找这样做的例子.
我需要在编译时对所有带注释的字符串进行编码,以便读取类文件不允许读取静态字符串:
基本代码:
String message = (@Obfuscated "a string that should not be readable in class file");
Run Code Online (Sandbox Code Playgroud)
应该重新修改为:
String message = new ObfuscatedString(new long[] {0x86DD4DBB5166C13DL, 0x4C79B1CDC313AE09L, 0x1A353051DAF6463BL}).toString();
Run Code Online (Sandbox Code Playgroud)
基于ObfuscatedString.obfuscate(String)
TrueLicense框架的静态方法,处理器可以生成代码以替换带注释的字符串.实际上,这个方法生成字符串"new ObfuscatedString([numeric_code]).toString()".在运行时,ObfuscatedString的toString()方法能够返回在数字代码中编码的字符串.
关于如何编写AnnotationProcessor的process()方法来编辑带注释的代码的任何想法?
提前致谢,
我想为消耗水槽源的火花流应用程序编写一个测试.
http://mkuthan.github.io/blog/2015/03/01/spark-unit-testing/建议使用ManualClock,但目前读取文件并验证输出对我来说已经足够了.
所以我希望使用:
JavaStreamingContext streamingContext = ...
JavaDStream<String> stream = streamingContext.textFileStream(dataDirectory);
stream.print();
streamingContext.awaitTermination();
streamingContext.start();
Run Code Online (Sandbox Code Playgroud)
不幸的是它没有打印任何东西.
我试过了:
什么都行不通.
有什么建议从文本文件中读取?
谢谢,
马丁
如果有人编辑JTable的单元格内容并按Enter键,则会修改内容并将表格选择移动到下一行.
是否可以禁止JTable在单元格版本之后进入下一行?
原因是我的程序使用ListSelectionListener在单元格选择上同步其他一些小部件,我不希望在编辑当前单元格后选择下一行.
我可以在eclipse中成功加载位于我的src/dir的某个包中的资源.现在,我导出jar(右键单击src,export,jar,并保留默认设置),并且不能在另一个eclipse项目中加载资源.
我通过指示站在相同包名中的类来构建资源的路径:
URL out = getClass().getClassLoader().getResource(packageName(getClass())+"file.glsl");
// out is null when loaded from a jar!!
protected static String packageName(Class<?> clazz){
return packageName(clazz.getPackage());
}
protected static String packageName(Package p){
return c + p.getName().replace('.', c) + c;
}
protected static char c = File.separatorChar;
Run Code Online (Sandbox Code Playgroud)
你看错了吗?我试过了:
我证实了这一点:
我无休止地检索一个null:/
编辑:截图和代码,以显示"应该工作"
你可以在这里检索这个SSCCE压缩的eclipse项目
用户类
public class User {
public static void main(String[] args) {
Loader pair = new Loader(SomeClass.class, "shade_vertex.glsl");
System.out.println("found:" + …
Run Code Online (Sandbox Code Playgroud) 我需要有最简单的方法通过外部 jar 提供接口的实现。我想避免使用文本/xml 文件,因为在重构类或接口名称时它可能会导致错误。
我尝试了 Netbeans Lookup,因为它有一个@ServiceProvider 注释,应该以声明性方式注册实现。
所以我写了一个简单的试用代码,它甚至没有将接口和提供者拆分到不同的jar中,但它仍然无法查找组件:
import org.openide.util.Lookup;
import org.openide.util.lookup.ServiceProvider;
public class LookupTrial {
public static void main(String[] args) {
IService s = Lookup.getDefault().lookup(IService.class);
if(s==null)
throw new RuntimeException("lookup failed");
else
s.hello();
}
public interface IService{
public void hello();
}
@ServiceProvider(service=IService.class)
public class MyImplementation implements IService{
public MyImplementation(){}
@Override
public void hello() {
System.out.println("hello lookup");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我是否错误地使用了Lookup?我应该搜索另一个查找库来执行我想要的操作吗?
我想使用旧方式(int i ...)循环遍历java List,因为对于给定的i和循环迭代,我想访问相对于i的几个元素.然后我不能使用(对象o:对象)列表迭代器.
在执行时,如何确保没有其他代码可以访问列表?
我试过了
synchronized(path.getPoints()){
for (int i = 0; i < path.getPoints().size(); i++){
...
}
}
Run Code Online (Sandbox Code Playgroud)
其中path是保存列表的对象,也是
synchronized(path){
for (int i = 0; i < path.getPoints().size(); i++){
...
}
}
Run Code Online (Sandbox Code Playgroud)
并且
synchronized(this){
for (int i = 0; i < path.getPoints().size(); i++){
...
}
}
Run Code Online (Sandbox Code Playgroud)
其中"this"是想要在没有同步问题的情况下完全呈现路径的渲染器.
提前致谢,
马丁
我经常使用java序列化,这对于存储完整的对象层次结构非常有用.
在尝试序列化SetMultimap时,我得到一个异常,说AbstractMultimap.WrappedSet不可序列化.
番石榴用户如何解决这个问题?
提前致谢,
我们正和朋友讨论java代码设计和效率问题.
他认为,出于性能原因,方法最好是私有的,以及在覆盖时最好保持类一致性.
我认为最好保护方法以获得完全的可定制性,并且一旦用户想要改变其部分行为,就应避免浪费时间修改和释放API.
我们知道组合优于继承,所以在这里我主要关注性能比较.
一个简单的测试(见下文)证明父类具有受保护方法的扩展类并不比具有私有方法的父类慢.甚至有时 (我真的不太了解性能变化)更快.
elapsed:8051733.063 microseconds for A (private)
elapsed:8036953.805 microseconds for B (protected)
Run Code Online (Sandbox Code Playgroud)
你认为下面提到的测试足够强大,可以进行比较吗?
public class VerifPerfProtected {
public static void main(String[] args) {
int ncalls = 1000000000; //10^9
ChildrenClassA a = new ChildrenClassA();
ChildrenClassB b = new ChildrenClassB();
long start = System.nanoTime();
a.manyCalls(ncalls);
long stop = System.nanoTime();
System.out.println("elapsed:" + (stop - start)/1000.0 + " microseconds for A (private)");
start = System.nanoTime();
b.manyCalls(ncalls);
stop = System.nanoTime();
System.out.println("elapsed:" + (stop - start)/1000.0 + " microseconds …
Run Code Online (Sandbox Code Playgroud) 我有一组文本文件提供解析,分析并允许构建模型的信息.有时,该模型的用户想要知道文本文件的哪个部分用于生成给定的模型项.
为此,我正在考虑跟踪行(或字节)id的范围,以便能够在需要时读取相应的文本部分.
我的问题是:我想知道它是否存在任何java Reader能够通过使用开始和停止行(或字节)id而不是从开始和计算行(字节)读取文件来读取文件?
最好的祝福