“ Java中的同步块已在某个对象上同步”是什么意思?

时间:2018-10-06 11:56:18

标签: java multithreading synchronized

我知道要实现线程安全和同步,我们可以使用同步块或方法。
但是我听不懂这句话-
“ Java中的同步块在某些对象上被同步

任何现实世界的示例都会有所帮助。

3 个答案:

答案 0 :(得分:2)

3个同步关键字的用法。


明确地:

final Object object = new Object();
synchronized(object) {

}

实例同步方法

synchronized void foo() {

}

它将使用当前实例作为监视器锁定,它等于:

void foo() {
    synchronized (this) {

    }
}

因此,当您在不同的实例上调用foo时,它们不会互相影响。


类同步方法

class Exmaple {

    static synchronized void foo() {

    }

}

它将使用当前类对象作为监视器锁定,它等于:

class Exmaple {

    static void foo() {
        synchronized (Exmaple.class) {

        }
    }   
}

答案 1 :(得分:0)

在执行同步块之前,同步需要对对象进行锁定(对象级别锁或类级别锁)。

因此,Java中的同步块在获得锁定的对象上同步。

例如:

synchronized (this)  // Lock on current object
synchronized (lockObject) // Lock on an object lockObject
synchronized(ClassA.class) // Lock on ClassA

答案 2 :(得分:0)

synchronized的作用是一次只能有一个线程执行同步代码。但是,如果我们关注细节,那不是全部。

假设我们有两个向量AB,并且想要从不同的线程调用各种方法。 Vector类通过同步所有重要方法是线程安全的。当线程T1执行A.add(5,"abc")时,为什么要阻止另一个线程执行B.get(5)?它们没有共同的数据元素,因此并行执行两个调用不会受到损害。

这里是“在A上同步”的概念:Vector方法在Vector实例上同步,因此最多一个线程可以为任何给定的Vector执行同步代码 strong>。

因此向量A在A上同步,向量B在B上同步。因此,没有两个线程可以并行操纵向量A,但是一个线程可以在A上工作,而另一个线程可以在B上独立工作。

  • 使用synchronized(object) { ... }构造,您可以确定要在其上进行同步的对象。
  • 在实例方法上使用synchronized关键字,您将在当前(this)对象上获得同步,因此每个实例都将获得自己的同步。
  • 在静态方法上使用synchronized关键字,可以在类上实现同步,因此可以保护该类的所有其他static synchronized方法不受任何实例的影响。