开发手册 欢迎您!
软件开发者资料库

Java并发 - 锁接口

Java并发锁接口 - 从简单和简单的步骤学习Java并发,从基本到高级概念,包括概述,环境设置,主要操作,线程通信,同步,死锁,ThreadLocal,ThreadLocalRandom,Lock,ReadWriteLock,Condition,AtomicInteger,AtomicLong ,AtomicBoolean,AtomicReference,AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray,Executor,ExecutorService,ScheduledExecutorService,newFixedThreadPool,newCachedThreadPool,newScheduledThreadPool,newSingleThreadExecutor,ThreadPoolExecutor,ScheduledThreadPoolExecutor,Futures and Callables,Fork-Join框架,BlockingQueue,ConcurrentMap,ConcurrentNavigableMap。

java.util.concurrent.locks.Lock接口用作类似于synchronized块的线程同步机制.新的锁定机制比同步块更灵活,提供更多选项. Lock和synchronized块之间的主要区别在于 :

  • 保证序列&减号;同步块不提供对等待线程进行访问的顺序的任何保证.锁接口处理它.

  • 无超时 : 如果未授予锁定,则同步块没有超时选项.锁定界面提供了这样的选项.

  • 单一方法 : 同步块必须完全包含在单个方法中,而锁接口的方法lock()和unlock()可以用不同的方法调用.

锁定方法

以下是Lock类中可用的重要方法列表.

Sr.No.方法&说明
1

public void lock()

获取锁定.

2

public void lockInterruptibly()

获取锁,除非当前线程被中断.

3

public Condition newCondition()

返回绑定到此Lock实例的新Condition实例.

4

public boolean tryLock()

只有在调用时它是空闲的时才获取锁.

5

公开boolean tryLock()

只有在调用时它是空闲的时才获取锁.

6

public boolean tryLock(很长一段时间,TimeU单位)

如果在给定的等待时间内空闲并且当前线程没有被中断,则获取锁.

7

public void unlock( )

释放锁定.

示例

以下TestThread程序演示了Lock接口的一些方法.这里我们使用lock()来获取锁定和解锁()以释放锁定.

import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class PrintDemo {   private final Lock queueLock = new ReentrantLock();   public void print() {      queueLock.lock();      try {         Long duration = (long) (Math.random() * 10000);         System.out.println(Thread.currentThread().getName()             + "  Time Taken " + (duration / 1000) + " seconds.");         Thread.sleep(duration);      } catch (InterruptedException e) {         e.printStackTrace();      } finally {         System.out.printf(            "%s printed the document successfully.\n", Thread.currentThread().getName());         queueLock.unlock();      }   }}class ThreadDemo extends Thread {   PrintDemo  printDemo;   ThreadDemo(String name,  PrintDemo printDemo) {      super(name);      this.printDemo = printDemo;   }      @Override   public void run() {      System.out.printf(         "%s starts printing a document\n", Thread.currentThread().getName());      printDemo.print();   }}public class TestThread {   public static void main(String args[]) {      PrintDemo PD = new PrintDemo();      ThreadDemo t1 = new ThreadDemo("Thread - 1 ", PD);      ThreadDemo t2 = new ThreadDemo("Thread - 2 ", PD);      ThreadDemo t3 = new ThreadDemo("Thread - 3 ", PD);      ThreadDemo t4 = new ThreadDemo("Thread - 4 ", PD);      t1.start();      t2.start();      t3.start();      t4.start();   }}

这将产生以下结果.

输出

Thread - 1  starts printing a documentThread - 4  starts printing a documentThread - 3  starts printing a documentThread - 2  starts printing a documentThread - 1   Time Taken 4 seconds.Thread - 1  printed the document successfully.Thread - 4   Time Taken 3 seconds.Thread - 4  printed the document successfully.Thread - 3   Time Taken 5 seconds.Thread - 3  printed the document successfully.Thread - 2   Time Taken 4 seconds.Thread - 2  printed the document successfully.

我们在这里使用ReentrantLock类作为Lock接口的实现. ReentrantLock类允许线程锁定方法,即使它已经锁定了其他方法.