首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:相关概念
1.1 并发和并行
1.2 进程和线程
1.3 线程调度
1.4 多线程的应用场景
第二章:线程的创建和使用
2.1 概述
2.1 JDK 5之前创建线程的方式
2.1.1 概述
2.1.2 继承 Thread 类
2.1.3 实现 Runnable 接口
2.1.4 继承方式和实现方式的区别
2.2 设置线程名称和获取线程名称
2.3 线程的优先级
第三章:线程安全
3.1 售票程序引出线程安全
3.2 线程安全的原因
3.3 线程安全的解决方法
3.4 JDK 5 之前解决线程安全
3.4.1 概述
3.4.2 同步机制的原理
3.4.3 同步机制中的锁
3.4.4 应用示例
3.5 JDK 5 之后解决线程安全
3.6 死锁
3.7 synchronized 与 Lock 的对比
第四章:线程通信
4.1 为什么需要线程通信?
4.2 等待唤醒机制
4.3 生产者和消费者问题
4.4 sleep() 和 wait() 方法的区别
4.5 生产者和消费者性能问题
4.6 Lock 接口的深入
第五章:单例设计模式
5.1 概述
5.2 单例模式
第六章:线程池
6.1 概述
6.2 线程池相关的API
6.3 实现 Callable 接口
6.4 ThreadPoolExecutor
第七章:线程的生命周期
第八章:volatile 关键字
8.1 概述
8.2 应用示例
第九章:原子性
9.1 概述
9.2 AtomicInteger
9.2.1 常用方法
9.2.2 原理
9.2.3 源码解析
9.3 synchronized 和 CAS 的区别
第十章:并发工具类
10.1 Hashtable
10.2 ConcurrentHashMap
10.3 CountDownLatch
10.4 Semaphore
当前位置:
首页>>
技术小册>>
Java语言基础8-Java多线程
小册名称:Java语言基础8-Java多线程
- Lock 接口替换了同步 synchronized ,提供了更加灵活,性能更好的锁定操作。 - 返回线程的阻塞队列: ```bash Condition newCondition(); ``` 生产者与消费者改进为 Lock 接口(借助 Condition 接口 (线程的阻塞队列)): ① 进入队列的线程,释放锁。 ② 出去队列的线程,再次的获取锁。 ③ 接口的方法 : await() 线程释放锁,进入队列。 ④ 接口的方法 : signal() 线程出去队列,再次获取锁。 注意:线程的阻塞队列,依赖 Lock 接口创建。 示例: ```bash package com.github.thread2.demo1; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author maxiaoke.com * @version 1.0 * */ public class Resource { private final Lock lock = new ReentrantLock(); // 通过Lock接口锁,创建出2个线程的阻塞队列 private final Condition prod = this.lock.newCondition(); // 生产者线程阻塞队列 private final Condition cust = this.lock.newCondition(); // 消费者线程阻塞队列 private int count; private boolean flag; public void produce() { // 获取锁 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } this.lock.lock(); while (this.flag) { // 无限等待,生产线程等待,执行到这里的线程,释放锁,进入到生产者的阻塞队列 try { this.prod.await(); } catch (InterruptedException e) { e.printStackTrace(); } } this.count++; System.out.println("生产第:" + this.count + "个"); // 修改标志位 this.flag = true; // 唤醒消费线程队列中的一个 this.cust.signal(); // 释放锁 this.lock.unlock(); } public void consume() { // 获取锁 this.lock.lock(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } while (!this.flag) { // 无限等待,消费线程等待,执行到这里的线程,释放锁,进入到消费者的阻塞队列 try { this.cust.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("消费第:" + this.count); // 修改标志位 this.flag = false; // 唤醒生产线程队列中的一个 this.prod.signal(); // 释放锁 this.lock.unlock(); } } ``` ```bash package com.github.thread2.demo1; /** * @author maxiaoke.com * @version 1.0 * */ public class Producer implements Runnable { private final Resource resource; public Producer(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { this.resource.produce(); } } } ``` ```bash package com.github.thread2.demo1; /** * @author maxiaoke.com * @version 1.0 * */ public class Consumer implements Runnable { private final Resource resource; public Consumer(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { this.resource.consume(); } } } ``` ```bash package com.github.thread2.demo1; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { Resource resource = new Resource(); Producer producer = new Producer(resource); Consumer consumer = new Consumer(resource); new Thread(producer).start(); new Thread(producer).start(); new Thread(producer).start(); new Thread(consumer).start(); new Thread(consumer).start(); } } ```
上一篇:
4.5 生产者和消费者性能问题
下一篇:
第五章:单例设计模式
该分类下的相关小册推荐:
Java语言基础3-流程控制
Java高并发秒杀入门与实战
Mybatis合辑1-Mybatis基础入门
java源码学习笔记
Mybatis合辑4-Mybatis缓存机制
Java语言基础14-枚举和注解
Java语言基础16-JDK8 新特性
Java语言基础5-面向对象初级
Java必知必会-Maven高级
SpringBoot合辑-初级篇
深入理解Java虚拟机
Mybatis合辑5-注解、扩展、SQL构建