synchronized和reentrantlock到底鎖了什麼?

第一個類,在add clear等方法裏使用可重入鎖 java

public class LockList extends ArrayList<Object>{

    private Lock lock = new ReentrantLock(false);

    @Override
    public boolean add(Object o) {
        lock.lock();
        try{
            System.out.println(Thread.currentThread().getName()+"add lock");
            return super.add(o);
        }finally {
            System.out.println(Thread.currentThread().getName()+"add unlock");
            lock.unlock();
        }
    }

    @Override
    public void clear() {
        lock.lock();
        try{
            System.out.println(Thread.currentThread().getName()+"clear lock");
            super.clear();
        }finally {
            System.out.println(Thread.currentThread().getName()+"clear unlock");
            lock.unlock();
        }
    }

    @Override
    public int size() {
        lock.lock();
        try{
            System.out.println(Thread.currentThread().getName()+"clear lock");
            return super.size();
        }finally {
            System.out.println(Thread.currentThread().getName()+"clear unlock");
            lock.unlock();
        }
    }


    public static void main(String[] args) {

        final LockList list = new LockList();

        for(int i=0;i<110;i++){
            final int j = i;
            new Thread(){
                @Override
                public void run() {
                    setName("線程"+j);
                    list.add(j);
                    list.clear();
                }
            }.start();
        }

    }
}

第二個類,在add remove方法裏使用synchronized關鍵字編程

public class SyncList extends ArrayList<Object> {

    @Override
    public boolean add(Object o) {
        synchronized (this){
            System.out.println(Thread.currentThread().getName() +"add synchronized lock");
            boolean r=  super.add(o);
            System.out.println(Thread.currentThread().getName() +"add synchronized unlock");
            return r;
        }
    }

    @Override
    public void clear() {
        synchronized (this){
            System.out.println(Thread.currentThread().getName() +"clear synchronized lock");
            super.clear();
            System.out.println(Thread.currentThread().getName() +"clear synchronized unlock");
        }
    }

    @Override
    public int size() {
        synchronized (this){
            System.out.println(Thread.currentThread().getName() +"size synchronized lock");
            int r= super.size();
            System.out.println(Thread.currentThread().getName() +"size synchronized unlock");
            return r;
        }
    }

    @Override
    public boolean addAll(Collection<?> c) {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName() +"addAll synchronized lock");
            boolean r= super.addAll(c);
            System.out.println(Thread.currentThread().getName() +"addAll synchronized unlock");
            return r;
        }
    }

    @Override
    public boolean remove(Object o) {
        synchronized (this){
            System.out.println(Thread.currentThread().getName() +"remove synchronized lock");
            boolean r= super.remove(o);
            System.out.println(Thread.currentThread().getName() +"remove synchronized unlock");
            return r;
        }
    }

    public static void main(String[] args) {
        final SyncList list = new SyncList();

        for(int i=0;i<110;i++){
            final int j = i;
            new Thread(){
                @Override
                public void run() {
                    setName("線程"+j);
//                    list.add(j);
                    list.remove(new Integer(j));
                }
            }.start();
        }
    }
}

 

第一個結果,能夠看到lock和unlock都是成在一個同一個線程裏對出現的,說明了調用該方法時另外的線程是進不來的,或者說進入等待隊列,這個要看AbstractQueueSynchronized的源碼,他對鎖進行了優化。併發

線程2add lock
線程2add unlock
線程2clear lock
線程2clear unlock
線程3add lock
線程3add unlock
線程3clear lock
線程3clear unlock
線程5add lock
線程5add unlock
線程5clear lock
線程5clear unlock
線程8add lock
線程8add unlock
線程8clear lock
線程8clear unlock
線程15add lock
線程15add unlock
線程23add lock
線程23add unlock
線程23clear lock
線程23clear unlock
線程15clear lock
線程15clear unlock
線程26add lock
線程26add unlock
線程26clear lock
線程26clear unlock
線程20add lock
線程20add unlock
線程20clear lock
線程20clear unlock
線程32add lock
線程32add unlock
線程32clear lock
線程32clear unlock
線程9add lock
線程9add unlock
線程9clear lock
線程9clear unlock
線程35add lock
線程35add unlock
線程35clear lock
線程35clear unlock
線程14add lock
線程14add unlock
線程14clear lock
線程14clear unlock
線程45add lock
線程45add unlock
線程45clear lock
線程45clear unlock
線程21add lock
線程21add unlock
線程21clear lock
線程21clear unlock
線程27add lock
線程27add unlock
線程27clear lock
線程27clear unlock
線程62add lock
線程62add unlock
線程68add lock
線程68add unlock
線程68clear lock
線程68clear unlock
線程1add lock
線程1add unlock
線程1clear lock
線程1clear unlock
線程33add lock
線程33add unlock
線程33clear lock
線程33clear unlock
線程6add lock
線程6add unlock
線程39add lock
線程39add unlock
線程39clear lock
線程39clear unlock
線程18add lock
線程18add unlock
線程18clear lock
線程18clear unlock
線程44add lock
線程44add unlock
線程44clear lock
線程44clear unlock
線程24add lock
線程24add unlock
線程30add lock
線程30add unlock
線程30clear lock
線程30clear unlock
線程63add lock
線程63add unlock
線程63clear lock
線程63clear unlock
線程41add lock
線程41add unlock
線程41clear lock
線程41clear unlock
線程17add lock
線程17add unlock
線程17clear lock
線程17clear unlock
線程105add lock
線程105add unlock
線程105clear lock
線程105clear unlock
線程99add lock
線程99add unlock
線程99clear lock
線程99clear unlock
線程92add lock
線程92add unlock
線程87add lock
線程87add unlock
線程87clear lock
線程87clear unlock
線程109add lock
線程109add unlock
線程109clear lock
線程109clear unlock
線程96add lock
線程96add unlock
線程96clear lock
線程96clear unlock
線程79add lock
線程79add unlock
線程79clear lock
線程79clear unlock
線程72add lock
線程72add unlock
線程72clear lock
線程72clear unlock
線程47add lock
線程47add unlock
線程47clear lock
線程47clear unlock
線程50add lock
線程50add unlock
線程50clear lock
線程50clear unlock
線程53add lock
線程53add unlock
線程53clear lock
線程53clear unlock
線程51add lock
線程51add unlock
線程51clear lock
線程51clear unlock
線程56add lock
線程56add unlock
線程56clear lock
線程56clear unlock
線程59add lock
線程59add unlock
線程59clear lock
線程59clear unlock
線程65add lock
線程65add unlock
線程65clear lock
線程65clear unlock
線程62clear lock
線程62clear unlock
線程69add lock
線程69add unlock
線程69clear lock
線程69clear unlock
線程0add lock
線程0add unlock
線程0clear lock
線程0clear unlock
線程4add lock
線程4add unlock
線程4clear lock
線程4clear unlock
線程7add lock
線程7add unlock
線程7clear lock
線程7clear unlock
線程10add lock
線程10add unlock
線程10clear lock
線程10clear unlock
線程12add lock
線程12add unlock
線程12clear lock
線程12clear unlock
線程6clear lock
線程6clear unlock
線程16add lock
線程16add unlock
線程16clear lock
線程16clear unlock
線程19add lock
線程19add unlock
線程19clear lock
線程19clear unlock
線程22add lock
線程22add unlock
線程22clear lock
線程22clear unlock
線程28add lock
線程28add unlock
線程28clear lock
線程28clear unlock
線程25add lock
線程25add unlock
線程25clear lock
線程25clear unlock
線程13add lock
線程13add unlock
線程13clear lock
線程13clear unlock
線程34add lock
線程34add unlock
線程34clear lock
線程34clear unlock
線程71add lock
線程71add unlock
線程71clear lock
線程71clear unlock
線程57add lock
線程57add unlock
線程57clear lock
線程57clear unlock
線程38add lock
線程38add unlock
線程38clear lock
線程38clear unlock
線程29add lock
線程29add unlock
線程29clear lock
線程29clear unlock
線程104add lock
線程104add unlock
線程104clear lock
線程104clear unlock
線程11add lock
線程11add unlock
線程11clear lock
線程11clear unlock
線程107add lock
線程107add unlock
線程107clear lock
線程107clear unlock
線程101add lock
線程101add unlock
線程101clear lock
線程101clear unlock
線程98add lock
線程98add unlock
線程98clear lock
線程98clear unlock
線程95add lock
線程95add unlock
線程95clear lock
線程95clear unlock
線程93add lock
線程93add unlock
線程93clear lock
線程93clear unlock
線程80add lock
線程80add unlock
線程80clear lock
線程80clear unlock
線程77add lock
線程77add unlock
線程77clear lock
線程77clear unlock
線程89add lock
線程89add unlock
線程89clear lock
線程89clear unlock
線程86add lock
線程86add unlock
線程86clear lock
線程86clear unlock
線程92clear lock
線程92clear unlock
線程83add lock
線程83add unlock
線程83clear lock
線程83clear unlock
線程81add lock
線程81add unlock
線程81clear lock
線程81clear unlock
線程75add lock
線程75add unlock
線程75clear lock
線程75clear unlock
線程106add lock
線程106add unlock
線程106clear lock
線程106clear unlock
線程108add lock
線程108add unlock
線程108clear lock
線程108clear unlock
線程103add lock
線程103add unlock
線程103clear lock
線程103clear unlock
線程102add lock
線程102add unlock
線程102clear lock
線程102clear unlock
線程97add lock
線程97add unlock
線程97clear lock
線程97clear unlock
線程94add lock
線程94add unlock
線程94clear lock
線程94clear unlock
線程100add lock
線程100add unlock
線程100clear lock
線程100clear unlock
線程91add lock
線程91add unlock
線程91clear lock
線程91clear unlock
線程85add lock
線程85add unlock
線程85clear lock
線程85clear unlock
線程88add lock
線程88add unlock
線程88clear lock
線程88clear unlock
線程90add lock
線程90add unlock
線程90clear lock
線程90clear unlock
線程84add lock
線程84add unlock
線程84clear lock
線程84clear unlock
線程82add lock
線程82add unlock
線程82clear lock
線程82clear unlock
線程78add lock
線程78add unlock
線程78clear lock
線程78clear unlock
線程76add lock
線程76add unlock
線程76clear lock
線程76clear unlock
線程73add lock
線程73add unlock
線程73clear lock
線程73clear unlock
線程70add lock
線程70add unlock
線程70clear lock
線程70clear unlock
線程67add lock
線程67add unlock
線程67clear lock
線程67clear unlock
線程60add lock
線程60add unlock
線程60clear lock
線程60clear unlock
線程58add lock
線程58add unlock
線程58clear lock
線程58clear unlock
線程49add lock
線程49add unlock
線程49clear lock
線程49clear unlock
線程54add lock
線程54add unlock
線程54clear lock
線程54clear unlock
線程52add lock
線程52add unlock
線程52clear lock
線程52clear unlock
線程48add lock
線程48add unlock
線程48clear lock
線程48clear unlock
線程42add lock
線程42add unlock
線程42clear lock
線程42clear unlock
線程64add lock
線程64add unlock
線程64clear lock
線程64clear unlock
線程40add lock
線程40add unlock
線程40clear lock
線程40clear unlock
線程24clear lock
線程24clear unlock
線程31add lock
線程31add unlock
線程31clear lock
線程31clear unlock
線程46add lock
線程46add unlock
線程46clear lock
線程46clear unlock
線程66add lock
線程66add unlock
線程66clear lock
線程66clear unlock
線程36add lock
線程36add unlock
線程36clear lock
線程36clear unlock
線程61add lock
線程61add unlock
線程61clear lock
線程61clear unlock
線程43add lock
線程43add unlock
線程43clear lock
線程43clear unlock
線程74add lock
線程74add unlock
線程74clear lock
線程74clear unlock
線程37add lock
線程37add unlock
線程37clear lock
線程37clear unlock
線程55add lock
線程55add unlock
線程55clear lock
線程55clear unlock

Process finished with exit code 0

第二個是你們都熟悉的synchorized關鍵字,打印結果只貼一部分,能夠看到結果和上面同樣,在加鎖的操做裏只有一個線程能進方法,也就是持有該對象,固然對於沒有加鎖的方法依然能夠被多個線程同時訪問(這個是老師教可是沒有本身證明過)。ide

線程59clear lock
線程59clear unlock
線程60add lock
線程60add unlock
線程60clear lock
線程60clear unlock
線程55add lock
線程55add unlock
線程55clear lock
線程55clear unlock
線程56add lock
線程56add unlock
線程56clear lock
線程56clear unlock
線程51add lock
線程51add unlock
線程51clear lock
線程51clear unlock
線程43add lock
線程43add unlock
線程43clear lock
線程43clear unlock
線程48add lock
線程48add unlock
線程48clear lock
線程48clear unlock
線程72add lock
線程72add unlock
線程72clear lock
線程72clear unlock
線程63add lock
線程63add unlock
線程63clear lock
線程63clear unlock
線程77add lock
線程77add unlock
線程77clear lock
線程77clear unlock
線程14add lock
線程14add unlock
線程14clear lock
線程14clear unlock
線程76add lock
線程76add unlock
線程76clear lock
線程76clear unlock
線程64add lock
線程64add unlock
線程64clear lock
線程64clear unlock
線程49add lock
線程49add unlock
線程49clear lock
線程49clear unlock
線程61add lock
線程61add unlock
線程61clear lock
線程61clear unlock
線程57add lock
線程57add unlock
線程57clear lock
線程57clear unlock
線程18add lock
線程18add unlock
線程18clear lock
線程18clear unlock
線程54add lock
線程54add unlock
線程54clear lock
線程54clear unlock

因此結論是可重入鎖鎖的是當前持有鎖的對象對象,和synchronized關鍵字鎖的後面括號裏的對象,能夠看出sync關鍵字的可讀性更好,由於能夠直接看到後面括號裏的類或對象,而可重入鎖沒有。可是可重入鎖的性能更好(具體好多少後面再出個博文),sync是系統級別函數調用開銷大(這句話是併發編程的藝術這本書裏寫的,背下來)函數

相關文章
相關標籤/搜索