【问题标题】:Java Synchronization processesJava 同步过程
【发布时间】:2012-12-13 08:13:16
【问题描述】:

拜托,我对以下场景的同步块和同步方法有疑问:

第 1 部分 --------------:

Class table
{
    Synchronized(this)
    {
        ……………………
    }
}

这里我们锁定了表类的对象。 --------------------------------------------------……

第二部分:

Class table
{
    Customer cust=new Customer();
    Synchronized(cust)
    {
        ……………………
    }
}

在这里我们锁定了客户的对象。即客户 在第 1 部分中,我们锁定了?- 表类的对象。 我们锁定了表类,因为表类的对象可能会尝试访问同步
同时从不同的地方阻塞。为了防止它我们锁定了表类的对象
在第 1 部分。 现在来到第2部分:? - 在这里,我们锁定了客户类的对象 --------------------------------------------------……

我的疑惑:

  1. 为什么我们要锁定一个表类中的对象,而不是part2中的表类?

  2. 如果我们在第 2 部分中没有获得对 cust 的锁定,那么我们可以使用表访问同步块 班级 如果我们锁定 cust,那么我们还需要表类的对象来访问同步块。 表类的对象只需要访问同步块。 由于同步,我们阻止了表类的对象访问同步块
    同时来自不同的线程。 那为什么要在表类中锁定表类以外的对象呢?

  3. 客户类的对象是否会尝试同时从
    访问同步块 不同的地方?

  4. 在第 2 部分中,我们锁定了表类以外的对象。 在什么情况下在表类的对象上锁定表类而不是表是
    在第 2 部分中锁定客户类对象的好处?

  5. 除了表类之外,客户类的对象需要锁定什么?

  6. 如果我们在part2中没有锁定客户类的对象会发生什么损坏?

拜托,我是 Java 线程的新手,一段时间以来我一直在努力解决这些问题。任何明确的解释都会有很大帮助。谢谢

【问题讨论】:

  • 您是否意识到等宽字体难以阅读文本?你介意破坏代码块中的文本吗?
  • 我强烈建议您修复格式。此外,Java 同步是一个广泛讨论的话题,因此您应该提及您已经在 StackOverflow 中看到的内容。
  • 当我在谷歌搜索“Java 同步做什么”时,第一个命中是这个 SO 问题:stackoverflow.com/questions/1085709/what-does-synchronized-mean
  • 您的所有示例都不是有效的 Java 代码 - 很难推断甚至无法编译的内容。

标签: java synchronization


【解决方案1】:

您应该检查的第一件事是: 不同类型的“同步”关键字将保护哪些类型的 DATA 字段。

静态变量/方法是类级别的对象,所有其他变量/方法都是实例级别。

类级锁是使一个类的所有对象等到对应的锁没有被释放的锁。

例如

Class A{
static synchronized void foo(){}
}

这里方法 foo 是同步的,因此类的所有对象上的所有线程都将等待,直到当前运行 foo 方法的对象完成执行。

类似地,实例级锁使得所有使用该类的实例启动的线程都等到锁没有被释放。

例如

Class A{
synchronized void bar(){}
}

这里从当前正在执行 bar 方法的对象启动的所有线程都将等待,直到当前线程完成其执行。请注意,其他对象的其他线程可以执行 bar 方法,而另一个对象的线程正在执行 bar 方法。

换句话说,一个线程不能进入一个同步的代码块,直到它持有 适当的对象锁。

对于instance methods,这是一个实例的锁。

对于static methods,这是类对象锁。

【讨论】:

    【解决方案2】:

    您似乎分析了一些现有代码并试图理解为什么会有同步。

    part1 和 part2 代码在同一个函数中吗?

    在第二部分中,同步没有意义。创建客户对象然后进行同步无效。第二个线程将创建一个新的客户对象并锁定该对象。

    如果您需要更改现有代码,您可以编写一个测试用例并跨越多个线程并移除同步,以查看是否可以强制执行多线程问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多