Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题。
一,ReentrantLock子类
一个可重入的互斥锁 Lock
,它具有与使用 synchronized
方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。
ReentrantLock
将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock
的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。
上一篇的例子用ReentrantLock如下:
public class PrintChar { private final Lock lock = new ReentrantLock(); public void output(String name) { try { lock.lock(); for (int i = 0; i < name.length(); i++) { System.out.print(name.charAt(i)); Thread.sleep(1); } } catch (InterruptedException e) { } finally { lock.unlock(); } } }
这样就实现了和sychronized一样的同步效果,需要注意的是,用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而用 Lock需要我们手动释放锁,所以为了保证锁最终被释放(发生异常情况),要把互斥区放在try内,释放锁放在finally内。
二,ReadWriteLock子类
在对数据进行读写的时候,为了保证数据的一致性和完整性,需要读和写是互斥的,写和写是互斥的,但是读和读是不需要互斥的,这样读和读不互斥性能更高些。
public class Data { private ReadWriteLock rwl = new ReentrantReadWriteLock(); private List<Integer> data = new ArrayList<Integer>(); public void set(int data) { try { rwl.writeLock().lock(); System.out.println(Thread.currentThread().getName() + "准备写入数据" + data); Thread.sleep(20); this.data.add(data); System.out.println(Thread.currentThread().getName() + "写入" + data); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwl.writeLock().unlock(); } } public void get() { try { rwl.readLock().lock(); System.out.println(Thread.currentThread().getName() + "准备读取数据"); Thread.sleep(20); System.out.println(Thread.currentThread().getName() + "读取" + this.data); } catch (InterruptedException e) { e.printStackTrace(); } finally { rwl.readLock().unlock(); } } }
public static void main(String[] args) { final Data data = new Data(); for (int i = 0; i < 2; i++) { new Thread(new Runnable() { public void run() { for (int j = 0; j < 3; j++) { data.set(new Random().nextInt(30)); } } }).start(); } for (int i = 0; i < 2; i++) { new Thread(new Runnable() { public void run() { for (int j = 0; j < 3; j++) { data.get(); } } }).start(); } }
输出结果:
Thread-0准备写入数据25 Thread-0写入25 Thread-0准备写入数据19 Thread-0写入19 Thread-1准备写入数据2 Thread-1写入2 Thread-1准备写入数据12 Thread-1写入12 Thread-3准备读取数据 Thread-2准备读取数据 Thread-2读取[25, 19, 2, 12] Thread-3读取[25, 19, 2, 12] Thread-0准备写入数据12 Thread-0写入12 Thread-1准备写入数据2 Thread-1写入2 Thread-2准备读取数据 Thread-3准备读取数据 Thread-3读取[25, 19, 2, 12, 12, 2] Thread-2读取[25, 19, 2, 12, 12, 2] Thread-2准备读取数据 Thread-3准备读取数据 Thread-3读取[25, 19, 2, 12, 12, 2] Thread-2读取[25, 19, 2, 12, 12, 2]
相关推荐
Java线程之锁对象Lock-同步问题更完美的处理方式代码实例 Java中的锁对象Lock是java.util.concurrent.locks包下的接口,提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。它能以更优雅的方式处理线程...
#### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用程序中(如`java.exe`),...
根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java...
Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...
#### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个进程拥有独立的内存空间。...
Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...
### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...
Java线程是Java编程语言中的核心概念,尤其在多任务处理和并发编程中扮演着重要角色。线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,...
Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含...
### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...
### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...
Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
1. 新状态(New):当通过`new Thread()`创建了一个线程对象,但还未调用`start()`方法时,线程处于新状态。此时,线程尚未启动,不具备执行的能力。 2. 可运行状态(Runnable):调用`start()`方法后,线程进入可...
Java线程是多任务编程的重要概念,特别是在Java这种支持并发执行的高级编程语言中。Java线程允许程序同时执行多个独立的代码段,这极大地提高了程序的效率和响应性。以下是对Java线程入门的详细讲解: 1. **线程的...
### Java线程使用教程知识点详解 #### 一、线程基础概述 - **定义与特点**:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java是首个在语言级别明确支持线程特性的...
Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...
最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...
- 就绪(Runnable):线程对象创建后,其他线程调用了该对象的start()方法,该状态下的线程位于可运行线程池中等待被线程调度选中,只有获得CPU时间,才可转到运行状态。 - 运行(Running):就绪状态下的线程获得...