在Java中
假设我有一个像
这样的代码class A {
method A(){
synchronized(this)
{
this.B();
}
}
method B(){
//do modification stuff here
}
}
我的问题是,如果一个线程在methodA上运行,而另一个线程在methodB上运行,那么我的synchronized块如何得到保护。??
答案 0 :(得分:2)
您还需要在方法B
中进行同步。
class A {
method A(){
synchronized(this)
{
this.B();
}
}
method B(){
synchronized(this)
//do modification stuff here
}
}
}
P.S。:由于您在方法的整个主体周围进行同步,因此可以在方法声明中使用synchronized
关键字:
public synchronized void methodA() {
this.B();
}
答案 1 :(得分:2)
Java中的 synchronized块在某个对象上同步。在同一对象上同步的所有同步块只能同时在其中执行一个线程。尝试进入同步块的所有其他线程都被阻塞,直到同步块内的线程退出块。
所以在你的案例中
method A(){
synchronized(this)
{
this.B();
}
}
直到1个线程退出方法A()没有其他线程可以输入它,所以它受到保护。
对于保护两种方法,您必须像这样使用
class A {
method A(){
synchronized(this)
{
this.B();
}
}
method B(){
synchronized(this)
//do modification stuff here
}
}
}
答案 2 :(得分:1)
如果我正确理解您的问题,您希望同步对这两种方法的访问:
class A{
synchronized void A() {
B();
}
synchronized void B() {
}
}
这样,A()
和B()
将使用相同的互斥锁进行门控,如果一个线程尝试运行B()
而另一个线程已经运行A()
,则将不得不等待。
在您给出的示例中,如果B()
是私有方法,并且您的所有线程都通过其A()
方法访问该对象,则不会出现问题,因为运行的线程{通过在B()
中输入synchronized{}
块,{1}}已经获得了锁定。