android開發之synchronized的用法
在android開發中synchronized主要有四種用法。第一是在方法聲明時使用;第二是在對某一代碼塊時使用;第三是對某一對象使用;第四是對某一類使用。具體的實現代碼如下:
1.方法聲明時使用
放在范圍操作符(public等)之後,返回類型聲明(void等)之前.這時,線程獲得的是成員鎖,即一次只能有一個線程進入該方法,其他線程要想在此時調用該方法,只能排隊等候,當前線程(就是在synchronized方法內部的線程)執行完該方法後,別的線程才能進入.
例如:

public synchronized void synMethod() {

//方法體

}
2.對某一代碼塊使用
synchronized後跟括號,括號裡是變量,這樣,一次只有一個線程進入該代碼塊.此時,線程獲得的是成員鎖.例如:

public int synMethod(int a1){

synchronized(a1) {

//一次只能有一個線程進入

}

}
3.對某一對象使用
synchronized後面括號裡是一對象,此時,線程獲得的是對象鎖.例如:

public class MyThread implements Runnable {

public static void main(String args[]) {

MyThread mt = new MyThread();

Thread t1 = new Thread(mt, "t1");

Thread t2 = new Thread(mt, "t2");

Thread t3 = new Thread(mt, "t3");

Thread t4 = new Thread(mt, "t4");

Thread t5 = new Thread(mt, "t5");

Thread t6 = new Thread(mt, "t6");

t1.start();

t2.start();

t3.start();

t4.start();

t5.start();

t6.start();

}

public void run() {

synchronized (this) {

System.out.println(Thread.currentThread().getName());

}

}

}

vc+01rLatcS3vbeooaPOqsqyw7TSqr2r1fu49rbUz/O2vMnPy/ijrLb4srvUytDtxuTL+8/fs8y2zNTdtdjKudPDttTP89bQxuTL+82ssr23vbeowLS3w87KubLP7dfK1LSjv8jnufvSu7j2ttTP89O109C24Lj218rUtKOsvs2yu9Do0qrWu86qwcvIw9K7uPbP37PMyrnTw8bk1tDSu7K/t9bXytS0o6y+zb2ry/nT0M/fs8y2vMv41NrN4sPmoaPTydPaw7+49rbUz/O2vNPQy/ijrL/J0tTI58/Cy/nKvsq508PQ6cTittTP88C0yc/L+KO6PC9wPgo8cD4KIDwvcD4KCjxpbWcgaWQ9"Codehighlighter1_21_474_Open_Image" src="https://www.android5.online/Android/UploadFiles_5356/201702/2017022316065478.gif" align="top" alt="\"> class FineGrainLock {

MyMemberClass x, y;

Object xlock = new Object(), ylock = new Object();

public void foo() {

synchronized(xlock) {

//access x here

}

//do something here - but don"t use shared resources

synchronized(ylock) {

//access y here

}

}

public void bar() {

synchronized(this) {

//access both x and y here

}

//do something here - but don"t use shared resources

}

}
4.對類使用時
synchronized後面括號裡是類,此時,線程獲得的是對象鎖.例如:

class ArrayWithLockOrder{

private static long num_locks = 0;

private long lock_order;

private int[] arr;

public ArrayWithLockOrder(int[] a)

{

arr = a;

synchronized(ArrayWithLockOrder.class) {//-----這裡

num_locks++; // 鎖數加 1。

lock_order = num_locks; // 為此對象實例設置唯一的 lock_order。

}

}

public long lockOrder()

{

return lock_order;

}

public int[] array()

{

return arr;

}

}

class SomeClass implements Runnable

{

public int sumArrays(ArrayWithLockOrder a1,

ArrayWithLockOrder a2)

{

int value = 0;

ArrayWithLockOrder first = a1; // 保留數組引用的一個

ArrayWithLockOrder last = a2; // 本地副本。

int size = a1.array().length;

if (size == a2.array().length)

{

if (a1.lockOrder() > a2.lockOrder()) // 確定並設置對象的鎖定

{ // 順序。

first = a2;

last = a1;

}

synchronized(first) { // 按正確的順序鎖定對象。

synchronized(last) {

int[] arr1 = a1.array();

int[] arr2 = a2.array();

for (int i=0; i
value += arr1[i] + arr2[i];
}
}
}
return value;

}
public void run() {
//
}
}

對於4,如果線程進入,則線程在該類中所有操作不能進行,包括靜態變量和靜態方法,實際上,對於含有靜態方法和靜態變量的代碼塊的同步,我們通常用4來加鎖.
以上為synchronized的四種用法。