- 場景
現在有多個線程需要對兩個方法都進行通路(一個方法名為test1,一個方法名為test2),但是有個要求:
同一個時間隻能兩個方法互斥通路,而且兩個方法可能在不同的類裡面。就是多個線程隻要有一個線程通路test1方法,那麼其他線程test1和test2方法都不能通路,相反一樣。
可能有人會想到synchronized關鍵字,但是如果兩個方法是在同一個類中,這種辦法能行得通,萬一不在同一個類中,那用synchronized就沒有任何意義。
當然可以用concurrent包裡面的AtomicBoolean來作為鎖關鍵字,略,這裡就簡單列個使用ReentrantLock代碼:
public static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
new Thread(){
@Override
public void run() {
test1();
}
}.start();
new Thread(){
@Override
public void run() {
test2();
}
}.start();
}
public static void test1(){
// lock.lock();
try {
System.out.println("aaaaaaaa");
Thread.sleep();
System.out.println("aaaaaaaa");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
// lock.unlock();
}
}
public static void test2(){
// lock.lock();
try {
System.out.println("bbbbbbbb");
Thread.sleep();
System.out.println("bbbbbbbb");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
// lock.unlock();
}
}
當不使用lock的時候很明顯test1和test2在同時執行:
aaaaaaaa
bbbbbbbb
bbbbbbbb
aaaaaaaa
Process finished with exit code
當使用lock的時候很明顯test1和test2是互斥執行:
bbbbbbbb
bbbbbbbb
aaaaaaaa
aaaaaaaa
Process finished with exit code