2014-03-03 89 views
2

有人問我這個問題,我不能夠找出解決辦法,我有一個類A與方法a1a2限制方法執行

Class A {a1() a2()}

和類B與方法b1b2

Class B {b1() b2()}

考慮到多線程環境,我想停止執行b1,當調用a1時,同樣適用於b2和a2。這兩個對象都是獨立的。這可能嗎?

回答

1
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()是互斥的,然後傳遞另一個鎖對象,並使這兩個方法同步在另一個鎖對象上。

+0

會不會更好,也使'對象鎖=新的對象();'最後 –

+0

來電者並不在意。一旦構造了A和B,它們就擁有對鎖的引用,重要的是它們的引用不會被重新分配給另一個鎖對象。 –

0

我在blog上試了一下。我希望它能幫助

這裏的想法是創建CD如果您考慮在Aa1()Bb1()應該是相互排斥的情況如下

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()的線程將等待,反之亦然。現在