第一個類,在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是系統級別函數調用開銷大(這句話是併發編程的藝術這本書裏寫的,背下來)函數