java

时间:2019-06-19 05:40:58

标签: java multithreading

我对理解“ this”在同步块中的作用不感到困惑。 我对同步块的用途有一些基本的了解。 This文章说-

  

不要在同步块的非最终字段上进行同步,因为   对非最终字段的引用可能随时更改,然后   不同的线程可能会在不同的对象上同步,即否   完全同步。

我不清楚它的实际含义。有人可以指导我了解在这种情况下 this 实际上是什么,以及为什么不应该在同步块中同步非最终字段。

2 个答案:

答案 0 :(得分:3)

Java中的

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代表该类的当前实例