android synchronized的使用
今天,簡單講講
synchronized 的使用。
synchronized 是Java語言關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執行該段代碼。synchronized 關鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。 ?
本文直接以代碼的形式來展示?synchronized 關鍵字的使用:
一.synchronized 的簡單示例
【1】synchronized ?Demo1:
package com.andyidea.demo;/*** 當兩個并發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,* 一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼* 塊以后才能執行該代碼塊。* @author Andy.Chen**/ public class Thread01 implements Runnable {@Overridepublic void run() {synchronized (this) {for(int i=0;i<3;i++){System.out.println(Thread.currentThread().getName()+" synchronized loop "+i);}}}public static void main(String[] args) {Thread01 t01 = new Thread01();System.out.println("Welcome to Andy.Chen Blog! \n"+"synchronized 關鍵字使用 \n"+"--------------------------");Thread ta = new Thread(t01,"A");Thread tb = new Thread(t01,"B");ta.start();tb.start();}}運行結果如下:
Welcome to Andy.Chen Blog! synchronized 關鍵字使用 -------------------------- B synchronized loop 0 B synchronized loop 1 B synchronized loop 2 A synchronized loop 0 A synchronized loop 1 A synchronized loop 2
【2】synchronized ?Demo2:
package com.andyidea.demo;/*** 當一個線程訪問object的一個synchronized(this)同步代碼塊時,* 另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。* @author Andy.Chen**/ public class Thread02 {public void method01(){synchronized (this) {int i=0;while(i++ < 3){System.out.println(Thread.currentThread().getName() +":"+ i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}public void method02(){//第1種方式:當一個線程訪問object的一個synchronized(this)同步代碼塊時,//另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。 // int j=0; // while(j++ < 3){ // System.out.println(Thread.currentThread().getName() +":"+ j); // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // }//第2種方式:當一個線程訪問object的一個synchronized(this)同步代碼塊時,//其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。synchronized (this) {int j=0;while(j++ < 3){System.out.println(Thread.currentThread().getName() +":"+ j);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}/*** 當一個線程訪問object的一個synchronized(this)同步代碼塊時,* 它就獲得了這個object的對象鎖。* 結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。*/public synchronized void method3(){int k=0;while(k++ < 3){System.out.println(Thread.currentThread().getName() +":"+ k);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {final Thread02 t02 = new Thread02();System.out.println("Welcome to Andy.Chen Blog! \n"+"synchronized 關鍵字使用 \n"+"--------------------------");Thread t02A = new Thread(new Runnable() {@Overridepublic void run() {t02.method01();}},"A");Thread t02B = new Thread(new Runnable() {@Overridepublic void run() {t02.method02();}},"B");Thread t02C = new Thread(new Runnable() {@Overridepublic void run() {t02.method3();}},"C");t02A.start();t02B.start();t02C.start();}}
運行結果如下:
二.synchronized與static synchronized 的區別
1.synchronized與static synchronized 的區別
????? synchronized是對類的當前實例進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊,注意這里是“類的當前實例”, 類的兩個不同實例就沒有這種約束了。那么static synchronized恰好就是要控制類的所有實例的訪問了,static synchronized是限制線程同時訪問jvm中該類的所有實例同時訪問對應的代碼快。實際上,在類中某方法或某代碼塊中有 synchronized,那么在生成一個該類實例后,改類也就有一個監視快,放置線程并發訪問改實例synchronized保護快,而static synchronized則是所有該類的實例公用一個監視快了,也也就是兩個的區別了,也就是synchronized相當于 this.synchronized,而
static synchronized相當于Something.synchronized.
????? 一個日本作者-結成浩的《java多線程設計模式》有這樣的一個列子:
????? pulbic class Something(){
???????? public synchronized void isSyncA(){}
???????? public synchronized void isSyncB(){}
???????? public static synchronized void cSyncA(){}
???????? public static synchronized void cSyncB(){}
???? }
?? 那么,加入有Something類的兩個實例a與b,那么下列組方法何以被1個以上線程同時訪問呢
?? a.?? x.isSyncA()與x.isSyncB()
?? b.?? x.isSyncA()與y.isSyncA()
?? c.?? x.cSyncA()與y.cSyncB()
?? d.?? x.isSyncA()與Something.cSyncA()
??? 這里,很清楚的可以判斷:
?? a,都是對同一個實例的synchronized域訪問,因此不能被同時訪問
?? b,是針對不同實例的,因此可以同時被訪問
?? c,因為是static synchronized,所以不同實例之間仍然會被限制,相當于Something.isSyncA()與?? Something.isSyncB()了,因此不能被同時訪問。
?? 那么,第d呢?,書上的 答案是可以被同時訪問的,答案理由是synchronzied的是實例方法與synchronzied的類方法由于鎖定(lock)不同的原因。
?? 個人分析也就是synchronized 與static synchronized 相當于兩幫派,各自管各自,相互之間就無約束了,可以被同時訪問。目前還不是分清楚java內部設計synchronzied是怎么樣實現的。
??? 結論:A: synchronized static是某個類的范圍,synchronized static cSync{}防止多個線程同時訪問這個??? 類中的synchronized static 方法。它可以對類的所有對象實例起作用。
??
?????????????? B: synchronized 是某實例的范圍,synchronized isSync(){}防止多個線程同時訪問這個實例中的synchronized 方法。
???? 2.synchronized方法與synchronized代碼快的區別
????? synchronized methods(){} 與synchronized(this){}之間沒有什么區別,只是 synchronized methods(){} 便于閱讀理解,而synchronized(this){}可以更精確的控制沖突限制訪問區域,有時候表現更高效率。
???? 3.synchronized關鍵字是不能繼承的
???? 這個在http://www.learndiary.com/archives/diaries/2910.htm一文中看到的,我想這一點也是很值得注意的,繼承時子類的覆蓋方法必須顯示定義成synchronized.
android synchronized的使用就講完了。
就這么簡單。
總結
以上是生活随笔為你收集整理的android synchronized的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 决TextView中Ma
- 下一篇: android 如何在线程缓存实体类