A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Synaric 中级黑马   /  2015-10-3 15:18  /  368 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


java.util.concurrent提供了显式的互斥锁机制,允许一些更细腻化的锁操作。我们需要显式创建一个互斥锁对象ReentrantLock。
    下面的示例中,线程尝试获取锁,如果获取失败,可以离开去执行一些事情:

  1. import java.util.concurrent.TimeUnit;
  2. import java.util.concurrent.locks.ReentrantLock;

  3. public class LockDemo {
  4.         //显式创建互斥锁
  5.         private ReentrantLock lock = new ReentrantLock();
  6.        
  7.         public void f(){
  8.                 //tryLock尝试获取锁,如果成功将立即返回true,反之false
  9.                 boolean captured = lock.tryLock();
  10.                
  11.                 try {
  12.                         System.out.println("f() " + captured);
  13.                 } finally {
  14.                         if(captured)
  15.                                 lock.unlock();
  16.                 }
  17.         }
  18.        
  19.         public void g(){
  20.                 boolean captured = false;
  21.                
  22.                 try {
  23.                         //在3秒内不断尝试获取锁
  24.                         captured = lock.tryLock(2, TimeUnit.SECONDS);
  25.                 } catch (InterruptedException e) {
  26.                         throw new RuntimeException(e);
  27.                 }
  28.                
  29.                 try {
  30.                         System.out.println("g() " + captured);
  31.                 } finally {
  32.                         if(captured)
  33.                                 lock.unlock();
  34.                 }
  35.         }
  36.        
  37.         public static void main(String[] args) {
  38.                 final LockDemo ld = new LockDemo();
  39.                 //测试顺序情况下是否正常
  40.                 ld.f();
  41.                 ld.g();
  42.                
  43.                 //测试并发情况下是否正常
  44.                 new Thread(){
  45.                         //设为守护线程
  46.                         { setDaemon(true); }
  47.                         public void run(){
  48.                                 //lock虽然是private域但是它比较特殊,对外可见
  49.                                 ld.lock.lock();
  50.                                 System.out.println("Thread");
  51.                         }
  52.                 }.start();
  53.                
  54.                 //建议调度
  55.                 Thread.yield();
  56.                
  57.                 //这些方法在匿名线程持有锁的时候尝试获取锁
  58.                 ld.f();
  59.                 ld.g();
  60.         }
  61. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马