我有一个在“非本”对象上使用同步语句的方法
class Some_Class {
public A s = new A();
public void method_A() {
synchronized(s) {
....
}
}
}
我可以改为扩展A类并按如下方式进行同步:
class B extends A {
public A a;
public B(A a) {
this.a = a;
}
public synchronized void some_m() {
...
}
}
class Some_Class {
public A s = new A();
public void method_A() {
B b = new B(s);
b.some_m();
}
}
这两个同步是否相同?
答案 0 :(得分:0)
不,他们不等同。这个方法在这里:
public synchronized void some_m() {
...
}
与此相同:
public void some_m() {
synchronized(this) {
...
}
}
或换句话说
A
中的Some_Class
实例上同步(一个类成员,对所有人都可见)。B
内的Some_Class.method_A()
实例上同步(一个局部变量,该方法外部不可见)答案 1 :(得分:0)
不,他们不等同。在第二种情况下,您实际上根本没有同步。因为some_m
方法在B
的实例上同步。所以你创建了B的本地实例并在其上调用方法。此方法仅在B的本地实例上同步,其他线程不关心它,并且可以使用s
执行任何操作,因为它不同步。
你能描述一下你想要达到的目标吗?
答案 2 :(得分:0)
同步块同步整个对象,而同步方法只同步该方法。在第二种情况下,某些线程仍然可以访问该对象的其他非同步方法。