Java5併發庫之鎖(一)

Java5併發庫的鎖位於java.util.concurrent.locks包,鎖的做用很是相似於傳統線程中的synchronizd(相關的例子能夠參見http://020618.blog.51cto.com/6098149/1182775),與synchronizd相比,鎖(lock)更加地面向對象,它主要用於互斥,與生活中的鎖相似,鎖自己也是一個對象,兩個線程執行的代碼片斷要實現同步互斥的效果,他們必須用同一個Lock對象。鎖是上在表明要操做的資源的類的內部方法中,而不是線程的代碼中。下面經過代碼看一下鎖的簡單使用。java

  • 1-1 一個鎖的運用的簡單例子
  
  
  
  
  1. import java.util.concurrent.locks.Lock; 
  2. import java.util.concurrent.locks.ReentrantLock; 
  3.  
  4. public class LockTest { 
  5.     public static void main(String[] args) { 
  6.         new LockTest().init(); 
  7.     } 
  8.      
  9.     private void init(){ 
  10.         final Outputer outputer = new Outputer(); 
  11.         new Thread(new Runnable(){ 
  12.             @Override 
  13.             public void run() { 
  14.                 while(true){ 
  15.                     try { 
  16.                         Thread.sleep(10); 
  17.                     } catch (InterruptedException e) { 
  18.                         e.printStackTrace(); 
  19.                     } 
  20.                     outputer.output("gaohao"); 
  21.                 } 
  22.                  
  23.             } 
  24.         }).start(); 
  25.          
  26.         new Thread(new Runnable(){ 
  27.             @Override 
  28.             public void run() { 
  29.                 while(true){ 
  30.                     try { 
  31.                         Thread.sleep(10); 
  32.                     } catch (InterruptedException e) { 
  33.                         e.printStackTrace(); 
  34.                     } 
  35.                     outputer.output("howdoyoudo"); 
  36.                 } 
  37.                  
  38.             } 
  39.         }).start(); 
  40.          
  41.     } 
  42.  
  43.     static class Outputer{ 
  44.         //定義一個鎖對象,它是一個接口,new它的實現類 
  45.         Lock lock = new ReentrantLock(); 
  46.         public void output(String name){ 
  47.             int len = name.length(); 
  48.             lock.lock();//一個線程進入的時候,鎖上,其它的線程搶佔同一個鎖時,其它的線程不能進 
  49.             try
  50.                 for(int i=0;i<len;i++){ 
  51.                     System.out.print(name.charAt(i)); 
  52.                 } 
  53.                 System.out.println(); 
  54.             }finally{//必定會執行的代碼 
  55.                 lock.unlock();//正常或非正常退出,都應該把鎖釋放,不然會致使死鎖 
  56.             } 
  57.         } 
  58.          
  59.         //使用synchronized實現互斥的方法 
  60.         /*public synchronized void output2(String name){ 
  61.             int len = name.length(); 
  62.             for(int i=0;i<len;i++){ 
  63.                     System.out.print(name.charAt(i)); 
  64.             } 
  65.             System.out.println(); 
  66.         }*/ 
  67.     } 

程序運行的結果:併發

能夠看到,利用鎖(Lock)一樣實現互斥的效果,兩個線程不斷的打印兩條完整的信息,他們彼此不會被對方打斷。ide

相關文章
相關標籤/搜索