有人問我這個問題,我不能夠找出解決辦法,我有一個類A
與方法a1
和a2
:限制方法執行
Class A {a1() a2()}
:
和類B
與方法b1
和b2
:
Class B {b1() b2()}
考慮到多線程環境,我想停止執行b1,當調用a1時,同樣適用於b2和a2。這兩個對象都是獨立的。這可能嗎?
有人問我這個問題,我不能夠找出解決辦法,我有一個類A
與方法a1
和a2
:限制方法執行
Class A {a1() a2()}
:
和類B
與方法b1
和b2
:
Class B {b1() b2()}
考慮到多線程環境,我想停止執行b1,當調用a1時,同樣適用於b2和a2。這兩個對象都是獨立的。這可能嗎?
public class A {
private final Object lock;
public A(Object lock) {
this.lock = lock;
}
public void a1() {
synchronized(lock) {
...
}
}
}
public class B {
private final Object lock;
public B(Object lock) {
this.lock = lock;
}
public void b1() {
synchronized(lock) {
...
}
}
}
如果你構建一個A和一個B和通過他們相同的鎖定對象,這兩個對象的a1()
和b1()
方法將是相互排斥的:
Object lock = new Object();
A a = new A(lock);
B b = new B(lock);
如果你想a2()
和b2()
是互斥的,然後傳遞另一個鎖對象,並使這兩個方法同步在另一個鎖對象上。
我在blog上試了一下。我希望它能幫助
這裏的想法是創建C
類D
如果您考慮在A
的a1()
和B
的b1()
應該是相互排斥的情況如下
class C {
static A a = new A(); //I have created new instances of A and B
static B b = new B(); //The same instances can be passed to C and D via constructor
static synchronized void da1() {
a.a1();
}
static synchronized void db1() {
b.b1();
}
}
class D {
static A a = new A();
static B b = new B();
static synchronized void ca2() {
a.a2();
}
static synchronized void cb2() {
b.b2();
}
}
,那麼你應該通過C
重定向他們兩個。
在C
,這兩種方法都是static synchronized
,這意味着只有一個方法可以在任何時刻執行(鎖是對象本身的class
)。因此,當執行a1()
時,執行b1()
的線程將等待,反之亦然。現在
會不會更好,也使'對象鎖=新的對象();'最後 –
來電者並不在意。一旦構造了A和B,它們就擁有對鎖的引用,重要的是它們的引用不會被重新分配給另一個鎖對象。 –