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]
synchronize(arr[index])
{
arr[index]++;
}
对
2) 如果答案是肯定的,那么锁的确切含义是什么?同步时程序对该锁做了什么
这意味着试图在同一对象上同步的其他线程将被阻止,直到“此代码”释放对象上的锁
还有记忆一致性效应。如果同步(正确地)一个线程,则可以保证看到另一个线程所做的更改
3) 另一个问题-它是只锁定单元格还是锁定整个数组 都不是。它锁定数组单元格引用的对象(整数实例) 此外,该锁仅适用于尝试在同一对象上同步的其他线程。如果另一个线程试图在另一个对象上同步,或者如果它试图在不同步的情况下访问该对象,那么它不会被阻止 4) 换句话说,另一个线程可以并行使用块中的arr[index+1]吗 这完全取决于另一个线程的作用。见上文
旁白:你的例子很奇怪。
Integer
对象是不可变的,因此在其上进行同步似乎没有什么意义。这可能只是一个人为的例子,但如果不是,那么您的应用程序设计很可能存在问题。不幸的是,这个例子没有为我们提供任何线索来理解您在这里真正想要做什么
但简单的教训是:
- 同步对象,而不是数组元素或变量
- 只有在使用共享对象时所有线程都同步时,同步才起作用
synchronized(foo)
时,无论foo
是否“有用”。重要的是同步块内发生了什么,在同一个foo
上同步了哪些其他同步块,以及哪些线程进入和离开这些块。最好的解释!谢谢对于protocol,这个例子只是为了让我更好地理解引擎…Re,“一个整数对象是不可变的,所以在它上面进行同步似乎没有什么意义。”在一个不可变的对象上进行同步是很正常的。我已经编写了多个synchronized(lock)
块,其中我声明lock
为private final Object lock=new Object()代码>对象
实例是不可变的。锁对象不需要是它所保护的数据结构的成员,有时您不希望它成为成员是有充分理由的。OP需要帮助理解这一点是的。。。但是1)通常使用对象
是因为您想要一个锁,2)这将是一个锁数组。我不相信OP在这方面需要帮助。当然,如果这仅仅是一个人为的例子,或者如果他应该这样做,那么OP不知道这在某种意义上是锁定了一个数组元素。我们不知道。