Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發之synchronized的用法

android開發之synchronized的用法

編輯:關於Android編程

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的四種用法。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved