Java5并发库的锁位于java.util.concurrent.locks包,锁的作用非常类似于传统线程中的synchronizd(相关的例子可以参见http://020618.blog.51cto.com/6098149/1182775),与synchronizd相比,锁(lock)更加地面向对象,它主要用于互斥,与生活中的锁类似,锁本身也是一个对象,两个线程执行的代码片段要实现同步互斥的效果,他们必须用同一个Lock对象。锁是上在代表要操作的资源的类的内部方法中,而不是线程的代码中。下面通过代码看一下锁的简单使用。

  • 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.     } 

程序运行的结果:

Java5并发库之锁(一)_并发库之锁

可以看到,利用锁(Lock)同样实现互斥的效果,两个线程不断的打印两条完整的信息,他们彼此不会被对方打断。