Java编程思想学习笔记-使用显式的Lock对象

若要保证后台线程在trylock()之前运行得到锁,可加“屏障”,如下1,2,3步,而trylock()不管设定时间与否都不会阻塞主线程而是立即返回:

//: concurrency/AttemptLocking.java

// Locks in the concurrent library allow you

// to give up on trying to acquire a lock.

package concurrency;



import java.util.concurrent.*;

import java.util.concurrent.locks.*;



public class AttemptLocking {

  private ReentrantLock lock = new ReentrantLock();

  public void untimed() {

    boolean captured = lock.tryLock();

    try {

//        for(int i = 0; i < 10; i++) System.out.println("untime i: " + i);

      System.out.println("tryLock(): " + captured);

    } finally {

      if(captured)

        lock.unlock();

    }

  }

  public void timed() {

    boolean captured = false;

    try {

      captured = lock.tryLock(2, TimeUnit.SECONDS);

    } catch(InterruptedException e) {

      throw new RuntimeException(e);

    }

    try {

//        for(int i = 0; i < 10; i++) System.out.println("time i: " + i);

      System.out.println("tryLock(2, TimeUnit.SECONDS): " +

        captured);

    } finally {

      if(captured)

        lock.unlock();

    }

  }

  public static void main(String[] args) throws InterruptedException {

    final AttemptLocking al = new AttemptLocking();

    al.untimed(); // True -- lock is available

    al.timed();   // True -- lock is available

 // Now create a separate task to grab the lock:

    final CountDownLatch latch = new CountDownLatch(1);//1.增加一个"屏障"

    new Thread() {

        {

            setDaemon(false);

        }



        public void run() {

            al.lock.lock();

            System.out.println("acquired");

            latch.countDown();//2.屏障解除

        }

    }.start();

    Thread.yield(); // Give the 2nd task a chance

    latch.await();//3.阻塞在屏障处直到屏障解除

    al.untimed(); // False -- lock grabbed by task

    al.timed();   // False -- lock grabbed by task

  }

} /* Output:

tryLock(): true

tryLock(2, TimeUnit.SECONDS): true

acquired

tryLock(): false

tryLock(2, TimeUnit.SECONDS): false

*///:~

 

你可能感兴趣的:(java编程思想)