Java同步过程

时间:2012-12-13 08:13:17

标签: java synchronization

请问,我对同步块和同步方法与下面的场景有疑问:

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

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

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

2部分:

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

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

我的怀疑:

  1. 为什么我们应该在第2部分中除表类之外的表类中锁定一个对象?

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

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

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

  5. 需要锁定客户类的对象,而不是表类?

  6. 如果我们在第2部分没有锁定客户类的对象会有什么损害?

  7. 请,我是Java线程的新手,我一直试图围绕这些问题。任何明确的解释都会有所帮助。感谢

2 个答案:

答案 0 :(得分:1)

你要检查的第一件事是: 对于不同类型,使用“synchronized”关键字保护哪种DATA字段。

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

类级别锁是一个锁,它使类的所有对象都等待,直到没有释放相应的锁。

e.g。

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

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

类似地,实例级别锁定使所有使用类实例启动的线程等到锁定未释放。

e.g。

Class A{
synchronized void bar(){}
}

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

换句话说,线程在保持之前不能输入同步的代码块 适当的对象锁定。

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

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

答案 1 :(得分:0)

您似乎在分析一些现有代码并尝试理解为什么存在同步。

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

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

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

相关问题