同步代码块是仅阻塞分配还是整个块体? - java

我有一个数据变量monthArray,可由多个使用者读取,并由单个periodallall预定的更新程序线程定期进行更新。全部异步。

我考虑了这两个选项,以安全地执行更新。

    ArrayList<String> tempArray = ModelJob.getDistinctMonths(user, true);       
    synchronized (monthArray) {
        monthArray = tempArray;
    }

要么

    synchronized (monthArray) {
        monthArray = ModelJob.getDistinctMonths(user, true);
    }

第一个想法背后的想法是ModelJob.getDistinctMonths(user, true);调用很耗时,我不想让synchrinzation阻塞得比它不得不阻塞的时间更长,这仅是为了用重新分配的数组快速重新分配旧数组。但是似乎很困惑,我只想在完全必要的时候这样做。谁能给我关于jvm如何处理这种同步和天气的任何见解,或者不这样做会给我性能的提高吗?基本上,我问jvm是否会阻止整个静态ModelJob调用,或者它是否能够仅通过阻止重新分配而逃脱并且是安全的,如果是,那么这样做是否足够聪明。

参考方案

假设您不需要围绕getDistinctMonths()调用进行同步(该调用是线程安全的,并且您不需要围绕该调用和分配进行原子操作),那么您就可以围绕该分配进行同步(是的,阻止仅作用于同步块,否则语法将毫无意义。注意,@ JohnVint带来了一个好处,即您不应该在monthArray引用上进行同步,因为它正在被修改。您必须在一个不变的单独对象实例上进行同步。

最后,您可以删除同步块并使monthArray成员易失,并获得相同的结果。

java.util.Scanner不返回到提示 - java

import java.util.Scanner; class newClass { public static void main(String args[]) { Scanner s = new Scanner(System.in); while (s.hasNext()) { System.out.println(s.next()); } s.clos…

Java.util.zip替换单个zip文件 - java

问题我有一个现有的zip文件“main.zip”。我要替换其中的单个文件“say main.zip/foo”。我知道: http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipOutputStream.html但是,这并不能满足我的要求,因为它会创建一个新的Zip文件-因此,我还必须在main.zi…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…