【问题标题】:What does "A synchronized block in Java is synchronized on some object" mean..?“Java中的同步块在某个对象上同步”是什么意思..?
【发布时间】:2018-10-06 11:56:17
【问题描述】:

我知道为了实现线程安全和同步,我们使用同步块或方法。
但我无法理解该声明-
"Java 中的同步块在某个对象上同步"

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

【问题讨论】:

  • 当你使用synchronized时,你总是在获取一个对象的锁。您没有锁定方法或代码块。
  • JVM 需要某个地方来存储关于锁的信息。
  • 对于一个真实世界的例子,它显示了在选择一个好的对象来锁定时的一些深思熟虑,请参阅stackoverflow.com/questions/7513227/…

标签: java multithreading synchronized


【解决方案1】:

synchronized 的作用是每次只有一个线程可以执行同步代码。但如果我们看细节,那并不是全部真相。

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

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

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

  • 使用synchronized(object) { ... } 构造,您可以决定要同步的对象。
  • 在实例方法上使用 synchronized 关键字,您可以获得当前 (this) 对象的同步,因此每个实例都有自己的同步。
  • 在静态方法上使用 synchronized 关键字,您可以获得类的同步,因此您可以防止此类的所有其他 static synchronized 方法,独立于任何实例。

【讨论】:

    【解决方案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) {
    
            }
        }   
    }
    

    【讨论】:

      【解决方案3】:

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

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

      例如:

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

      【讨论】:

      • 我们可以传递任何对象作为参数吗..?
      • 是的,您将锁定该对象。
      猜你喜欢
      • 2010-11-08
      • 2011-12-12
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多