【问题标题】:what is this piece of code doing [duplicate]这段代码在做什么[重复]
【发布时间】:2016-08-02 14:45:57
【问题描述】:
public int synchronizedBlockGet() {
    synchronized( this ) {
        return i;
    }
}

我在阅读一些文章时遇到了这段代码。什么是同步的?一个类,或方法或接口?请解释一下。

【问题讨论】:

  • 它正在同步实例,所以没有多个线程可以获取 i 的值

标签: java synchronized


【解决方案1】:

它是一个关键字,它一次只允许单个线程进入块。

它将通过获取该对象的锁定来实现。

【讨论】:

    【解决方案2】:

    在处理线程时会出现同步或一般同步。例如,假设您的程序中有 2 个线程。这两个线程都使用同一个对象。 (考虑一个线程正在写入 ArrayList 而另一个线程正在读取它的场景)。在这些情况下,我们必须确保当一个线程正在写入列表时,另一个线程不会进行读取或写入。这是因为,写入列表至少需要 3 个步骤

    1. 从内存中读取
    2. 修改对象(列表)
    3. 写回内存。

    为了保证这些线程不拦截,不会造成不一致,我们使用了线程同步的概念。

    有几种实现同步的方法,包括同步方法和同步块。您提供的代码是一个同步块。

    public int synchronizedBlockGet() {
        synchronized( this ) {
            return i;
        }
    }
    

    这里发生的情况是,一旦一个线程在 synchronizedBlockGet 方法中,它将锁定整个对象(称为获取锁定对象)上述方法所在的位置。 synchronized(this) 表示当前线程将锁定整个对象。因此,在当前线程离开同步块并释放该对象之前,没有其他线程可以访问该对象。尽管您给出的示例不是同步的必要情况,但后面发生的事情是一样的。

    【讨论】:

    • 我完全明白了。但是一个查询是,同步一个内置的方法或接口或类?
    • 不是其中任何一个。它更像是一个内置的概念或语法,可以完成我上面解释的事情。
    • 非常感谢,除了这个例子之外,还有哪些我们可以使用同步的情况?
    • 我明白了。我读了另一个解释。谢谢
    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多