我对理解“ this”在同步块中的作用不感到困惑。 我对同步块的用途有一些基本的了解。 This文章说-
不要在同步块的非最终字段上进行同步,因为 对非最终字段的引用可能随时更改,然后 不同的线程可能会在不同的对象上同步,即否 完全同步。
我不清楚它的实际含义。有人可以指导我了解在这种情况下 this 实际上是什么,以及为什么不应该在同步块中同步非最终字段。
答案 0 :(得分:3)
this 表示当前对象或实例 像这样
class TreeNode {
int content;
TreeNode left;
TreeNode right;
public TreeNode(int content, TreeNode left, TreeNode right) {
this.content = content;
this.left = left;
this.right = right;
}
public void setContent(int content) {
synchronized (this) {
this.content = content;
}
}
}
在上面的代码中,此始终表示相同的含义:实例本身。
关于这篇文章,我的理解是不要这样:
Class Test{
Student ken = new Student('ken');
public void LockTest() {
synchronized(ken){
doSomething();
}
}
}
由于obj是非最终字段,因此可以通过ken = new Student('adam');
在某个地方进行更改,在这种情况下,同步可能只能首先锁定Student('ken')
实例,
,然后引用ken已经更改为Student('adam')
实例,其他线程将发现Student('adam')
未锁定,因此进入同步块。
因此,如果您同步非最终字段,则可能会有许多不同的锁。
答案 1 :(得分:1)
this
代表该类的当前实例