Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用同步块的锁_Java_Arrays_Multithreading_Synchronization - Fatal编程技术网

Java 使用同步块的锁

Java 使用同步块的锁,java,arrays,multithreading,synchronization,Java,Arrays,Multithreading,Synchronization,如果我有变量Integer[]arr=new Integer[5]并且我使用其中一个单元格作为同步块锁-我可以在块内使用它吗 synchronize(arr[index]) { arr[index]++; } 如果答案是肯定的,那么锁的确切含义是什么?同步时程序对该锁做了什么 另一个问题-它是只锁定单元格还是锁定整个数组 换句话说,另一个线程是否可以并行使用块中的arr[index+1] 谢谢 它锁定恰好位于同步块开头数组中位置索引处的对象(整数)。这在整数的情况下不是很有用,因为语

如果我有变量
Integer[]arr=new Integer[5]
并且我使用其中一个单元格作为同步块锁-我可以在块内使用它吗

synchronize(arr[index])
{
    arr[index]++;
}
  • 如果答案是肯定的,那么锁的确切含义是什么?同步时程序对该锁做了什么


  • 另一个问题-它是只锁定单元格还是锁定整个数组

  • 换句话说,另一个线程是否可以并行使用块中的
    arr[index+1]
  • 谢谢

    它锁定恰好位于同步块开头数组中位置索引处的对象(整数)。这在整数的情况下不是很有用,因为语句arr[index]++将用另一个(未锁定的)对象替换对象

    更新

    它不会锁定任何有用的内容,也不会锁定整个数组,也不会锁定位置索引处的单元格。此外,整数对象(不可变)可以保留在缓存中,以便作为valueOf()的结果重用。如果数组未初始化,也可能会得到NullPointerException。 总之:不要那样做

    1) 。。。。我可以在街区内使用吗

    synchronize(arr[index])
    {
        arr[index]++;
    }
    

    2) 如果答案是肯定的,那么锁的确切含义是什么?同步时程序对该锁做了什么

    这意味着试图在同一对象上同步的其他线程将被阻止,直到“此代码”释放对象上的锁

    还有记忆一致性效应。如果同步(正确地)一个线程,则可以保证看到另一个线程所做的更改


    3) 另一个问题-它是只锁定单元格还是锁定整个数组

    都不是。它锁定数组单元格引用的对象(整数实例)

    此外,该锁仅适用于尝试在同一对象上同步的其他线程。如果另一个线程试图在另一个对象上同步,或者如果它试图在不同步的情况下访问该对象,那么它不会被阻止

    4) 换句话说,另一个线程可以并行使用块中的arr[index+1]吗

    这完全取决于另一个线程的作用。见上文


    旁白:你的例子很奇怪。
    Integer
    对象是不可变的,因此在其上进行同步似乎没有什么意义。这可能只是一个人为的例子,但如果不是,那么您的应用程序设计很可能存在问题。不幸的是,这个例子没有为我们提供任何线索来理解您在这里真正想要做什么


    但简单的教训是:

    • 同步对象,而不是数组元素或变量
    • 只有在使用共享对象时所有线程都同步时,同步才起作用

    “它是只锁定单元还是锁定整个阵列?”-既不锁定,也不锁定。它“锁定”了那个代码块是的我知道。。我还有别的事。。。我编辑我的问题编辑不会改变任何事情。没有人会阻止你使用任何arr[index]做任何事情,不管它是什么索引。这段代码所做的就是在当前线程到达该语句时,根据arr[index]的内容同步这一行代码。我希望代码中有不可预测的行为。为什么不可预测?另一个-你说在块中-没有机会平行改变相同的索引?所以。。。你说答案是-1。是的。是吗?@J.Doe关键是,你不应该用那个整数作为锁。为什么不呢?我真的很好奇-它是否有效?\n我猜您正在尝试以独占方式访问数组中的某个索引。但你不是。您拥有对内容(Integer的实例)的独占访问权,该内容对于任何线程都可能不同,但也可能相同。见史蒂文的答案。很好的解释。Re,“它不会锁定任何有用的东西”,当您编写
    synchronized(foo)
    时,无论
    foo
    是否“有用”。重要的是同步块内发生了什么,在同一个
    foo
    上同步了哪些其他同步块,以及哪些线程进入和离开这些块。最好的解释!谢谢对于protocol,这个例子只是为了让我更好地理解引擎…Re,“一个整数对象是不可变的,所以在它上面进行同步似乎没有什么意义。”在一个不可变的对象上进行同步是很正常的。我已经编写了多个
    synchronized(lock)
    块,其中我声明
    lock
    private final Object lock=new Object()对象
    实例是不可变的。锁对象不需要是它所保护的数据结构的成员,有时您不希望它成为成员是有充分理由的。OP需要帮助理解这一点是的。。。但是1)通常使用
    对象
    是因为您想要一个锁,2)这将是一个锁数组。我不相信OP在这方面需要帮助。当然,如果这仅仅是一个人为的例子,或者如果他应该这样做,那么OP不知道这在某种意义上是锁定了一个数组元素。我们不知道。