`

java多线程中锁(lock)、wait、notify()的使用

    博客分类:
  • java
阅读更多
package com.kai.多线程间的通信;

import java.util.ArrayList;
import java.util.List;

/**
* 重点说明:
* 1.实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用
* 2.lock.wait(); 等待,并且释放锁
* 3.lock.notify(); 唤醒,不释放锁
* */


public class ListAdd2 {
private volatile static List list = new ArrayList();
public void add(){
list.add("bjsxt");
}
public int size(){
return list.size();
}

public  static void main(String[] args) {
final ListAdd2 list2 = new ListAdd2();
//实例化一个lock,使用wait和notify的时候一定要配合synchronized关键字去使用
final Object lock = new Object();

Thread t1 = new Thread(new Runnable() {
public void run() {
try {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
list2.add();
System.out.println("当前线程:"+Thread.currentThread().getName()+ "添加了一个元素");
Thread.sleep(500);
if(list2.size()==5){
System.out.println("size==5,已发出通知");
//线程唤醒,但是并不释放锁, 所以,等t1线程执行完毕, t2线程才能得到锁,继续执行
lock.notify();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
public void run() {
synchronized (lock) {
if(list2.size()!=5){
try {
//线程等待,并且释放锁
lock.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("当前线程收到通知:"+Thread.currentThread().getName()+ "list.size==5线程停止");
throw new RuntimeException();//抛出运行时异常
}
}
},"t2");
//t2先执行,等待,释放锁
t2.start();
//t1在t2释放锁后执行,当list.size==5时唤醒t2线程,但是这个时候并没有释放锁,
//所以t2必须等t1执行完毕后才能得到锁,继续执行
t1.start();
}
}

执行流程:
1.t2先执行,等待,释放锁
2.t1在t2释放锁后执行,当list.size==5时唤醒t2线程,但是这个时候并没有释放锁,继续add().
3.t1执行完毕后,释放锁.
4.t2得到锁继续执行


运行结果:





  • 大小: 38.6 KB
分享到:
评论

相关推荐

    java多线程、锁的教程跟案例

    在Java中,多线程允许程序同时执行多个任务,提高CPU的利用率,而锁则是用来控制多线程间共享资源的访问,确保数据的一致性和完整性。 一、Java多线程 1. **线程创建方式** - 继承Thread类:自定义类继承Thread类...

    java多线程经典案例

    Java中,可以通过wait()、notify()和notifyAll()这三个Object类的方法来实现线程间的通信。这些方法必须在同步环境中使用,否则会抛出异常。此外,Java 5引入了BlockingQueue阻塞队列,它是一种线程安全的数据结构,...

    java多线程进度条

    为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...

    java多线程Demo

    在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...

    Java多线程中Lock锁的使用总结

    Java中的Lock锁是用于解决多线程访问共享资源时的同步问题的。Lock锁可以分为两种:独占锁和共享锁。独占锁允许多个线程访问同一个资源,但是同一时刻只能有一个线程可以访问该资源。共享锁允许多个线程同时访问同一...

    JAVA多线程编程技术PDF

    Java提供了wait(), notify()和notifyAll()方法,这些方法用于在线程间交换信息,但必须在同步块中使用,以防止死锁和其他并发问题。此外,还有java.util.concurrent工具包,包含如BlockingQueue等高级并发结构,它们...

    java 多线程并发实例

    本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...

    等待机制与锁机制wait notify

    首先,我们需要了解Java中的对象锁。每个Java对象都有一个内置的锁,当多个线程尝试访问同一对象的同步方法或同步代码块时,只有一个线程能够获取到这个锁并执行,其他线程则必须等待。这就是Java的互斥锁机制,用于...

    JAVAJAVA多线程教学演示系统论文

    3. **线程同步与并发控制**:论文会深入讲解JAVA中的线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的使用。此外,可能会探讨并发工具类,如Semaphore、...

    Java多线程编程实战指南-核心篇

    Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...

    Java多线程练习题

    1. wait()、notify()和notifyAll():这三个方法用于线程间的通信,但必须在synchronized代码块或方法中使用,否则会抛出IllegalMonitorStateException。 2. 生产者消费者模型:使用wait()和notify()实现线程间的协作...

    Java多线程技术精讲

    Java提供了wait()、notify()和notifyAll()方法,这些方法与synchronized配合使用,可以在对象的等待池中唤醒或通知其他线程。另外,java.util.concurrent包中的BlockingQueue是一个高效的线程间通信工具,它可以安全...

    java多线程设计模式详解(PDF及源码)

    (注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...

    Java多线程编程

    在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **Thread类**:Java中的`Thread`类是线程的基础,它代表了程序中的一个执行流。创建一个新的线程通常有两种方式:...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **线程间通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的协作,需要在同步块或方法中使用。 3. **线程池** - **Executor框架**:`ExecutorService`、`ThreadPoolExecutor`和`Executors`工厂类...

    java多线程源码,仅供参考

    同步机制是Java多线程中解决竞态条件的关键,主要包含`synchronized`关键字、`Lock`接口及其实现类、`wait()`和`notify()`等方法。`synchronized`可以保证同一时刻只有一个线程访问特定的代码块,防止数据的不一致。...

    Java多线程结构_Java多线程结构_

    在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当自定义类继承Thread类时,你需要重写它的`run()`方法。创建线程实例后,调用`start()`方法启动线程。`start()`会调用...

    java多线程详解(比较详细的阐述了多线程机制)

    另外,wait()、notify()和notifyAll()方法用于线程间的通信,但它们必须在同步块或方法中使用,以确保正确唤醒等待的线程。 Java还引入了Lock接口和相关的实现,如ReentrantLock,提供比synchronized更细粒度的控制...

    java多线程示例

    本示例着重探讨如何在Java中实现和管理多线程,以及它带来的挑战和解决方案。 一、Java多线程基础 1. 创建线程: - 继承Thread类:创建一个新的类,继承自Thread类,重写其run()方法,然后创建该类的实例并调用...

    Java多线程编程核心技术_完整版_java_

    1. wait()、notify()和notifyAll():这三个方法用于线程间的通信,它们必须在同步环境中使用。 2. Condition接口:配合Lock使用,提供更灵活的线程间通信方式。 五、线程池 1. Executor框架:Java 5引入的...

Global site tag (gtag.js) - Google Analytics