2012-12-13 78 views
0

同步的块,并与下面的场景同步方法之间请,我有疑问:Java同步处理

第一部分 --------------:

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

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

第2部分:

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

这里我们锁定了customer.ie的对象cust 在part1中,我们锁定了表类的对象。 因为表类的对象可能试图同时访问来自不同位置的已同步的
块,所以我们锁定了表类。为了防止它,我们锁定了第1部分中的表类
的对象。 现在来到part2:? - 这里我们锁定了客户类的对象 ------------------------------- ------- ...

我的疑惑:

  1. 我们为什么要锁定在比第2部分的表类其他表类的对象?

  2. 如果我们没有得到卡斯特部分2锁定那么我们就可以使用表 类如果我们锁定卡斯特那么我们还需要表类的对象来访问synchronized块访问synchronized块。 表类的对象只需要访问同步块。 由于同步,我们阻止表类的对象同时访问来自不同线程的同步块
    。 那么为什么我们应该在table类中锁定table类以外的对象呢?

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

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

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

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

请问,我是新来的Java线程,我一直试图围绕这些问题围绕我的头一段时间。任何明确的解释将有助于很多。谢谢

+0

您是否意识到等宽字体很难读取文本?你介意打破代码块中的文字吗? –

+0

我强烈建议您修改格式。此外,Java同步是一个广泛讨论的主题,所以您应该提到您已经在StackOverflow中查看过的内容。 –

+0

当我搜索“什么是Java同步做”在谷歌,第一次打是这个SO问题:http://stackoverflow.com/questions/1085709/what-does-synchronized-mean –

回答

1

您应该检查的第一件事是: 什么样的数据字段将使用“同步”关键字保护不同类型。

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

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

例如

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

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

同样,一个实例级别锁使所有使用类实例启动的线程等待,直到锁未释放。

例如

Class A{ 
synchronized void bar(){} 
} 

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

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

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

对于static methods这是Class对象锁。

0

看来你分析了一些现有的代码,并试图理解为什么有同步。

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

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

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