在Java Path-String中使用File.separator
和普通/
有什么区别?
与双反斜杠\\
平台相比,独立性似乎不是原因,因为两个版本都可以在Windows和Unix下运行.
public class SlashTest {
@Test
public void slash() throws Exception {
File file = new File("src/trials/SlashTest.java");
assertThat(file.exists(), is(true));
}
@Test
public void separator() throws Exception {
File file = new File("src" + File.separator + "trials" + File.separator + "SlashTest.java");
assertThat(file.exists(), is(true));
}
}
Run Code Online (Sandbox Code Playgroud)
要重新解释这个问题,如果/
适用于Unix和Windows,为什么要使用File.separator
?
如果从多个线程访问Java中的变量,则必须确保它们被安全地发布.这通常意味着使用synchronized
或volatile
.
我的印象是,我的一些同事并没有认真对待这个问题,因为他们"以前从未听过,volatile
而且他们的计划已经工作了多年".
所以我的问题是:
有人可以提供示例Java程序/片段,可靠地显示数据可见性问题.
我认为运行一个程序并看到意外的NPE或陈旧的变量值将有助于更多,而不仅仅是理论上的解释,这是无法证明的.
非常感谢你的帮助!
更新:再强调一点.我已经阅读了Java Concurreny in Practice,并且知道理论上存在可见性问题的示例.我正在寻找的是一种真正展示它们的方法.我不确定,这实际上是可行的,但也许有一个jvm配置或类似的东西允许它.
我正在编写一个库来收集我将在不同应用程序中使用的各种函数.我希望它为库的用户生成可见的日志语句,即,如果我正在构建应用程序并且我正在使用该库,我希望库生成对我可见的日志语句.我怎么做?由于日志文件将由应用程序的开发人员配置,我的库如何知道如何记录?
我的问题涉及在Java中安全发布字段值(这里讨论Java多线程和安全发布).
据我了解,如果出现以下情况,可以安全地读取字段(意味着从多个线程访问将看到正确的值):
如果我的理解是正确的,那么下面的类不应该是线程安全的,因为初始值是在没有这些特性的情况下编写的.但是我觉得很难相信我需要制作,first
volatile
即使它只是从一个synchronized
方法访问.
public class Foo {
private boolean needsGreeting = true;
public synchronized void greet() {
if (needsGreeting) {
System.out.println("hello");
needsGreeting = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?以上代码是否正确,如果是,为什么?或者在这种情况下,除了从方法访问它之外,还需要制作first
volatile
或使用final AtomicBoolean
类似的东西.synchronized
(只是为了澄清,我知道,如果初始值是用synchronized
方法编写的,即使没有volatile
关键字,它也是线程安全的.)
具有闭包的语言(例如Ruby)使得优雅的构造能够转换列表.假设我们有一个班级
class QueryTerm {
String value;
public String getValue() {...}
}
Run Code Online (Sandbox Code Playgroud)
以及List<QueryTerm> terms
我们想要转换为其值列表的术语列表List<String> values
.
在Ruby中我们可以编写如下内容:
values1 = terms.collect do |term|
term.getValue()
end
Run Code Online (Sandbox Code Playgroud)
Java强制我们构造结果列表并自己遍历术语集合(至少在引入foreach之后没有涉及迭代器或索引位置):
Collection<String> values2 = new HashSet<String>();
for (QueryTerm term : terms) {
values2.add(term.getValue());
}
Run Code Online (Sandbox Code Playgroud)
Apache Commons和Google Collections2尝试使用匿名类来模拟Java中的闭包:
Collection<String> values3 = Collections2.transform(terms, new Function<QueryTerm, String>() {
@Override
public String apply(QueryTerm term) {
return term.getValue();
}
});
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这个版本有更多的代码行和比原始版本更多的字符!我认为由于这个原因很难理解.因此,当我在Apache Commons中看到它时,我就驳回了这个想法.然而,最近我在谷歌收藏中看到它,我开始怀疑我是否遗漏了一些东西.
因此我的问题是:您对上述结构有何看法?您认为该Collections2.transform()
版本比默认版本更易读/可理解吗?我完全错过了什么吗?
最好的问候,约翰内斯