乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      對(duì)synchronized(this)的一些理解

       風(fēng)自向前 2011-01-19
      一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。

      二、然而,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。

      三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。

      四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說(shuō),當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞。

      五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用.

      舉例說(shuō)明:

      一、當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。

      package ths;

      public class Thread1 implements Runnable {
      public void run() {
      synchronized(this) {
      for (int i = 0; i < 5; i++) {
      System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);
      }
      }
      }
      public static void main(String[] args) {
      Thread1 t1 = new Thread1();
      Thread ta = new Thread(t1, "A");
      Thread tb = new Thread(t1, "B");
      ta.start();
      tb.start();
      }
      }


      結(jié)果:
      A synchronized loop 0
      A synchronized loop 1
      A synchronized loop 2
      A synchronized loop 3
      A synchronized loop 4
      B synchronized loop 0
      B synchronized loop 1
      B synchronized loop 2
      B synchronized loop 3
      B synchronized loop 4



      二、然而,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問(wèn)該object中的非synchronized(this)同步代碼塊。

      package ths;
      public class Thread2 {
      public void m4t1() {
      synchronized(this) {
      int i = 5;
      while( i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : " + i);
      try {
      Thread.sleep(500);
      } catch (InterruptedException ie) {
      }
      }
      }
      }
      public void m4t2() {
      int i = 5;
      while( i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : " + i);
      try {
      Thread.sleep(500);
      } catch (InterruptedException ie) {
      }
      }
      }
      public static void main(String[] args) {
      final Thread2 myt2 = new Thread2();
      Thread t1 = new Thread(
      new Runnable() {
      public void run() {
      myt2.m4t1();
      }
      }, "t1"
      );
      Thread t2 = new Thread(
      new Runnable() {
      public void run() {
      myt2.m4t2();
      }
      }, "t2"
      );
      t1.start();
      t2.start();
      }
      }



      結(jié)果:
      t1 : 4
      t2 : 4
      t1 : 3
      t2 : 3
      t1 : 2
      t2 : 2
      t1 : 1
      t2 : 1
      t1 : 0
      t2 : 0



      三、尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),其他線程對(duì)object中所有其它synchronized(this)同步代碼塊的訪問(wèn)將被阻塞。

      //修改Thread2.m4t2()方法:

      public void m4t2() {
      synchronized(this) {
      int i = 5;
      while( i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : " + i);
      try {
      Thread.sleep(500);
      } catch (InterruptedException ie) {
      }
      }
      }

      }



      結(jié)果:



      t1 : 4
      t1 : 3
      t1 : 2
      t1 : 1
      t1 : 0
      t2 : 4
      t2 : 3
      t2 : 2
      t2 : 1
      t2 : 0



      四、第三個(gè)例子同樣適用其它同步代碼塊。也就是說(shuō),當(dāng)一個(gè)線程訪問(wèn)object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖。結(jié)果,其它線程對(duì)該object對(duì)象所有同步代碼部分的訪問(wèn)都被暫時(shí)阻塞。

      //修改Thread2.m4t2()方法如下:

      public synchronized void m4t2() {
      int i = 5;
      while( i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : " + i);
      try {
      Thread.sleep(500);
      } catch (InterruptedException ie) {
      }
      }
      }



      結(jié)果:
      t1 : 4
      t1 : 3
      t1 : 2
      t1 : 1
      t1 : 0
      t2 : 4
      t2 : 3
      t2 : 2
      t2 : 1
      t2 : 0



      五、以上規(guī)則對(duì)其它對(duì)象鎖同樣適用:



      package ths;

      public class Thread3 {
      class Inner {
      private void m4t1() {
      int i = 5;
      while(i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);
      try {
      Thread.sleep(500);
      } catch(InterruptedException ie) {
      }
      }
      }
      private void m4t2() {
      int i = 5;
      while(i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
      try {
      Thread.sleep(500);
      } catch(InterruptedException ie) {
      }
      }
      }
      }
      private void m4t1(Inner inner) {
      synchronized(inner) { //使用對(duì)象鎖
      inner.m4t1();
      }
      }
      private void m4t2(Inner inner) {
      inner.m4t2();
      }
      public static void main(String[] args) {
      final Thread3 myt3 = new Thread3();
      final Inner inner = myt3.new Inner();
      Thread t1 = new Thread(
      new Runnable() {
      public void run() {
      myt3.m4t1(inner);
      }
      }, "t1"
      );
      Thread t2 = new Thread(
      new Runnable() {
      public void run() {
      myt3.m4t2(inner);
      }
      }, "t2"
      );
      t1.start();
      t2.start();
      }
      }



      結(jié)果:

      盡管線程t1獲得了對(duì)Inner的對(duì)象鎖,但由于線程t2訪問(wèn)的是同一個(gè)Inner中的非同步部分。所以兩個(gè)線程互不干擾。
      t1 : Inner.m4t1()=4
      t2 : Inner.m4t2()=4
      t1 : Inner.m4t1()=3
      t2 : Inner.m4t2()=3
      t1 : Inner.m4t1()=2
      t2 : Inner.m4t2()=2
      t1 : Inner.m4t1()=1
      t2 : Inner.m4t2()=1
      t1 : Inner.m4t1()=0
      t2 : Inner.m4t2()=0



      現(xiàn)在在Inner.m4t2()前面加上synchronized:



      private synchronized void m4t2() {
      int i = 5;
      while(i-- > 0) {
      System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
      try {
      Thread.sleep(500);
      } catch(InterruptedException ie) {
      }
      }
      }



      結(jié)果:

      盡管線程t1與t2訪問(wèn)了同一個(gè)Inner對(duì)象中兩個(gè)毫不相關(guān)的部分,但因?yàn)閠1先獲得了對(duì)Inner的對(duì)象鎖,所以t2對(duì)Inner.m4t2()的訪問(wèn)也被阻塞,因?yàn)閙4t2()是Inner中的一個(gè)同步方法。

      t1 : Inner.m4t1()=4
      t1 : Inner.m4t1()=3
      t1 : Inner.m4t1()=2
      t1 : Inner.m4t1()=1
      t1 : Inner.m4t1()=0
      t2 : Inner.m4t2()=4
      t2 : Inner.m4t2()=3
      t2 : Inner.m4t2()=2
      t2 : Inner.m4t2()=1
      t2 : Inner.m4t2()=0

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多