android開發之synchronized的用法

來源:互聯網
上載者:User

android開發之synchronized的用法

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="http://www.bkjia.com/uploads/allimg/150212/041Z51A4-0.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的四種用法。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.