天天看點

使用ReentrantLock兩個方法的互斥通路

  • 場景

現在有多個線程需要對兩個方法都進行通路(一個方法名為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