请问,我对同步块和同步方法与下面的场景有疑问:
1部分 --------------:
Class table
{
Synchronized(this)
{
……………………
}
}
这里我们锁定了表类的对象。 -------------------------------------- ...
2部分:
Class table
{
Customer cust=new Customer();
Synchronized(cust)
{
……………………
}
}
这里我们锁定了customer.i.e对象的对象
在part1中,我们锁定了? - table类的对象。
我们得到表类的锁,因为表类的对象可能会尝试访问同步的
同时阻止来自不同的地方。为了防止它我们锁定了表类的对象
在第1部分。
现在来到第2部分:? -
在这里,我们锁定了客户类的对象
-------------------------------------- ...
我的怀疑:
为什么我们应该在第2部分中除表类之外的表类中锁定一个对象?
如果我们在第2部分中没有锁定cust,那么我们可以使用表访问synchronized块
类
如果我们锁定cust,那么我们还需要表类的对象来访问synchronized块。
表类的对象只需要访问synchronized块。
由于同步,我们阻止了表类的对象访问同步块
同时来自不同的线程。
那么我们为什么要锁定表类中除table table之外的对象?
客户类的对象是否会尝试同时访问同步块 不同的地方?
在第2部分中,我们锁定了除表类之外的对象。 在什么情况下,在table类以外的类的对象上获取锁定是为什么 在第2部分中锁定客户类对象的好处?
需要锁定客户类的对象,而不是表类?
如果我们在第2部分没有锁定客户类的对象会有什么损害?
请,我是Java线程的新手,我一直试图围绕这些问题。任何明确的解释都会有所帮助。感谢
答案 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可以线程并删除同步以查看是否可以强制执行多线程问题。