小编ass*_*ias的帖子

以UTC格式将LocalDateTime转换为LocalDateTime

以UTC格式将LocalDateTime转换为LocalDateTime.

LocalDateTime convertToUtc(LocalDateTime date) {

    //do conversion

}
Run Code Online (Sandbox Code Playgroud)

我在网上搜索过.但没有得到解决方案

java utc java-8 java-time

57
推荐指数
8
解决办法
9万
查看次数

Java中的最终数组

Java中的以下代码使用了一个final数组,String并且毫无疑问.

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它在控制台上显示以下输出.

I can never change
Run Code Online (Sandbox Code Playgroud)

以下代码也毫无疑问.

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    //CONSTANT_ARRAY={"I", "can", "never", "change"}; //Error - can not assign to …
Run Code Online (Sandbox Code Playgroud)

java

54
推荐指数
3
解决办法
6万
查看次数

指令重新排序和发生在java之前的关系

在Java Concurrency In Practice一书中,我们被告知可以通过编译器,JVM在运行时甚至由处理器重新排序程序的指令.因此,我们应该假设执行的程序不会以与我们在源代码中指定的顺序完全相同的顺序执行其指令.

但是,讨论Java内存模型的最后一章提供了一个先前发生的规则列表,指出了JVM保留了哪些指令排序.这些规则中的第一条是:

  • "程序顺序规则.线程中的每个操作都发生在程序顺序后面的该线程中的每个操作之前."

我相信"程序顺序"是指源代码.

我的问题:假设这个规则,我想知道什么指令可能实际重新排序.

"行动"定义如下:

Java内存模型是根据操作指定的,包括对变量的读取和写入,监视器的锁定和解锁,以及启动和连接线程.JMM定义了在程序中的所有操作之前调用的部分排序.为了保证执行动作B的线程可以看到动作A的结果(A和B是否出现在不同的线程中),必须在A和B之间的关系之前发生.在没有发生之前在两个之间进行排序操作,JVM可以随意重新排序.

其他提到的订单规则是:

  • 监控锁定规则.监视器锁定上的解锁发生在同一监视器锁定的每个后续锁定之前.
  • 易变变量规则.对每个后续读取同一字段之前发生对易失性字段的写入.
  • 线程启动规则.在线程上调用Thread.start会在启动线程中的每个操作之前发生.
  • 线程终止规则.线程中的任何操作都发生在任何其他线程检测到该线程已终止之前,可以通过成功从Thread.join返回,也可以通过Thread.isAlive返回false.
  • 中断规则.另一个线程上的线程调用中断发生在被中断的线程检测到中断之前(通过抛出InterruptedException,或者调用isInterrupted或中断).
  • 终结者规则.对象的构造函数的结束发生在该对象的终结器的开始之前.
  • 及物.如果A发生在B之前,B发生在C之前,那么A发生在C之前.

java concurrency multithreading java-memory-model

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

在LocalDate和sql.Date之间转换

什么是之间进行转换的正确方法java.sql.DateLocalDate(Java8)?

java date converter java-8 java-time

50
推荐指数
1
解决办法
6万
查看次数

为什么Files.lines(和类似的Streams)不会自动关闭?

Stream的javadoc说明:

Streams有一个BaseStream.close()方法并实现AutoCloseable,但几乎所有的流实例实际上都不需要在使用后关闭.通常,只有源为IO通道的流(例如Files.lines(Path,Charset)返回的流)才需要关闭.大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理.(如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源.)

因此,绝大多数情况下,人们可以在单行中使用Streams,collection.stream().forEach(System.out::println);但是对于Files.lines和其他资源支持的流,必须使用try-with-resources语句或泄漏资源.

这让我觉得容易出错并且不必要.因为Streams只能迭代一次,所以在我看来,没有一个迭代后Files.lines不应该关闭输出的情况,因此实现应该只是在任何终端操作结束时隐式调用close .我错了吗?

java stream resource-leak java-8 java-stream

48
推荐指数
3
解决办法
9075
查看次数

为什么Android Studio中的模拟器速度很慢?

我刚刚在我的PC上安装了Android Studio,这是开发Android应用程序的新功能.

我的问题是,当我尝试在模拟器中运行我的小应用程序时,需要花费很多时间才能启动,之后仿真器工作也很慢.

AVD设置

AVD名称:Glaxy
设备:Glaxy Nexus(4.65",720x 1280:xhdpi)
目标:Android 4.2.2 - API级别17
内存选项:Ram 500,VM堆64
内部存储:200MiB

我有很好的窗口电脑:Intel Core 2 Duo 2.93Ghz和Ram是3gb

我是Android开发和java的新手.

android android-virtual-device android-emulator android-studio

46
推荐指数
4
解决办法
13万
查看次数

如何正确确定一个对象是一个lambda?

我看到lambda的类是isSynthetic() && !isLocalOrAnonymousClass(),但我认为代理类可能也是如此.

当然,我可以检查getDeclaredMethods().length == 1并申请regexp课程名称.

但是我想知道是否有一个更优雅和更健壮的选项来查明给定对象是否是lambda.

java lambda java-8

44
推荐指数
1
解决办法
4617
查看次数

不变性和重新排序

下面的代码(Java Concurrency in Practice清单16.3)由于显而易见的原因而不是线程安全的:

public class UnsafeLazyInitialization {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null)
            resource = new Resource();  // unsafe publication
        return resource;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,几页之后,在第16.3节中,他们指出:

UnsafeLazyInitialization如果 Resource是不可变的,实际上是安全的.

我不明白这句话:

  • 如果Resource是不可变的,那么观察resource变量的任何线程都将看到它为null或完全构造(由于Java内存模型提供的最终字段的强保证)
  • 但是,没有什么可以阻止指令重新排序:特别是两个读取resource可以重新排序(在一个读取if和一个读取return).因此,线程可以resourceif条件中看到非null 但返回空引用(*).

我认为UnsafeLazyInitialization.getInstance()即使Resource是不可变的也可以返回null .是这样的,为什么(或为什么不)?


(*)为了更好地理解我关于重新排序的观点,Jeremy Manson的博客文章是JLS并发的第17章的作者之一,解释了如何通过良性数据竞争安全地发布String的哈希码以及如何删除使用局部变量可能导致哈希码错误地返回0,因为可能的重新排序非常类似于我上面描述的:

我在这里做的是添加一个额外的读取:在返回之前的第二次读取哈希.听起来很奇怪,并且不太可能发生,第一次读取可以返回正确计算的散列值,第二次读取可以返回0!这在内存模型下是允许的,因为该模型允许对操作进行大量重新排序.第二次读取实际上可以在您的代码中移动,以便您的处理器在第一次读取之前完成!

java concurrency multithreading java-memory-model

42
推荐指数
1
解决办法
2545
查看次数

在Java 8中,转换Optional.empty中空String的Optional <String>

给定一个String我需要获得一个Optional,如果String为null或为空,则结果为Optional.empty.我可以这样做:

String ppo = "";
Optional<String> ostr = Optional.ofNullable(ppo);
if (ostr.isPresent() && ostr.get().isEmpty()) {
    ostr = Optional.empty();
}
Run Code Online (Sandbox Code Playgroud)

但肯定必须有一种更优雅的方式.

java optional java-8

42
推荐指数
3
解决办法
4万
查看次数

并行流,收集器和线程安全

请参阅下面的简单示例,该示例计算列表中每个单词的出现次数:

Stream<String> words = Stream.of("a", "b", "a", "c");
Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1,
                                                      (i, j) -> i + j));
Run Code Online (Sandbox Code Playgroud)

最后,wordsCount{a=2, b=1, c=1}.

但我的流非常大,我想要并行工作,所以我写道:

Map<String, Integer> wordsCount = words.parallel()
                                       .collect(toMap(s -> s, s -> 1,
                                                      (i, j) -> i + j));
Run Code Online (Sandbox Code Playgroud)

但是我注意到这wordsCount很简单HashMap所以我想知道我是否需要明确要求并发映射以确保线程安全:

Map<String, Integer> wordsCount = words.parallel()
                                       .collect(toConcurrentMap(s -> s, s -> 1,
                                                                (i, j) -> i + j));
Run Code Online (Sandbox Code Playgroud)

非并发收集器是否可以安全地与并行流一起使用,还是在从并行流收集时只应使用并发版本?

java parallel-processing concurrency java-8 java-stream

39
推荐指数
3
解决办法
1万
查看次数