小编Joe*_*e23的帖子

File.separator与路径中的斜杠之间的区别

在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

189
推荐指数
7
解决办法
28万
查看次数

如何演示java多线程可见性问题?

如果从多个线程访问Java中的变量,则必须确保它们被安全地发布.这通常意味着使用synchronizedvolatile.

我的印象是,我的一些同事并没有认真对待这个问题,因为他们"以前从未听过,volatile而且他们的计划已经工作了多年".

所以我的问题是:

有人可以提供示例Java程序/片段,可靠地显示数据可见性问题.

我认为运行一个程序并看到意外的NPE或陈旧的变量值将有助于更多,而不仅仅是理论上的解释,这是无法证明的.

非常感谢你的帮助!

更新:再强调一点.我已经阅读了Java Concurreny in Practice,并且知道理论上存在可见性问题的示例.我正在寻找的是一种真正展示它们的方法.我不确定,这实际上是可行的,但也许有一个jvm配置或类似的东西允许它.

java multithreading visibility

30
推荐指数
3
解决办法
5383
查看次数

Java库的记录器

我正在编写一个库来收集我将在不同应用程序中使用的各种函数.我希望它为库的用户生成可见的日志语句,即,如果我正在构建应用程序并且我正在使用该库,我希望库生成对我可见的日志语句.我怎么做?由于日志文件将由应用程序的开发人员配置,我的库如何知道如何记录?

java logging packaging

26
推荐指数
1
解决办法
2万
查看次数

在同步方法中读取值时安全发布

我的问题涉及在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关键字,它也是线程安全的.)

java multithreading thread-safety

11
推荐指数
1
解决办法
354
查看次数

Java中的闭包模拟是否有意义?

具有闭包的语言(例如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 CommonsGoogle 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()版本比默认版本更易读/可理解吗?我完全错过了什么吗?

最好的问候,约翰内斯

java

8
推荐指数
2
解决办法
857
查看次数