java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码
wait()/notify()方法
await()/signal()方法
BlockingQueue阻塞队列方法
PipedInputStream/PipedOutputStream
阻塞队列的一个简单实现:
public class BlockingQueue {
private List queue = new LinkedList();
private int limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public synchronized void enqueue(Object item)throws InterruptedException {
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
public synchronized Object dequeue() throws InterruptedException{
while(this.queue.size() == 0){
wait();
}
if(this.queue.size() == this.limit){
notifyAll();
}
return this.queue.remove(0);
}}
在enqueue和dequeue方法内部,只有队列的大小等于上限(limit)或者下限(0)时,才调用notifyAll方法。如果队列的大小既不等于上限,也不等于下限,任何线程调用enqueue或者dequeue方法时,都不会阻塞,都能够正常的往队列中添加或者移除元素。
wait()/notify()方法
生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。
java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码相关推荐
- java反射获取实体类_java 反射获取类对象的三种方式
Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...
- JAVA中的arraylist集合_java中遍历ArrayList集合的四种方式
详细内容 ArrayList遍历:取出ArrayList集合中的数据 方式一:for循环 方式二:增强for循环:foreach 方式三:Iterator:迭代器 方式四:ListIterator:双 ...
- java 连接mongodb 集群_Java 连接MongoDB集群的几种方式
先决条件 先运行mongodb肯定是必须的,然后导入以下包: import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; im ...
- java 循环依赖_浅谈Spring解决循环依赖的三种方式
引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...
- java如何显示当天世界_Java学习笔记——显示当前日期的三种方式
一.Date类:这是一种过时的表达方式 import java.util.Date;Date date = new Date(); System.out.println((1900+date.getY ...
- java中的map对象_java中遍历Map对象的四种方式
import java.util.HashMap; import java.util.Map; /** * 遍历Map对象 * @author xiaosongsong: * @CreateTime ...
- java自定义拦截所有请求_Java实现拦截HTTP请求的几种方式
在Java的服务端开发当中,拦截器是很常见的业务场景,这里对Java开发当中几种常见的拦截器的实现方式进行记录和分析.案例说明基于Spring Boot环境. 一:实现javax.servlet.Fi ...
- java set去重复元素_java List去掉重复元素的几种方式
使用LinkedHashSet删除arraylist中的重复数据(有序) List words= Arrays.asList("a","b","b&q ...
- java list 去重复元素_java List去掉重复元素的几种方式
使用LinkedHashSet删除arraylist中的重复数据(有序) List words= Arrays.asList("a","b","b&q ...
- SpringBoot解决跨域的5种方式
本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...
最新文章
- 17. 搭建FTP服务端
- 通过调用门进行控制转移 ——《x86汇编语言:从实模式到保护模式》读书笔记29
- android adb 联系人,使用adb命令向Android模拟器中导入通讯录联系人的方法
- Log4j的快速入门
- 语言三做一年级算题_一年级数学期末考试,学生交卷说能考100分,快让你家孩子试试吧...
- 第 4 章(表达式和运算符)(4.1~ 4.7)
- SQLAlchemy engine.Engine
- 三角网导线平差实例_导线三角网平差计算中的Wd是什么意思啊?怎么的算出来的?...
- 几种简单的图像加密方法
- 【语音识别入门】Python音频处理示例(含完整代码)
- Jlink修复指南step by step指导(实践成功) 更新 适用win7-10
- Arcgis进行人口密度计算
- 线性不可分转可分----低维空间转高维空间
- NXP LPC1768最小系统板Keil开发环境流程演示
- 承认多元化,保持宽容
- OpenCvSharp人脸识别系统(视频中的人脸)
- Scroll View到达底部加载新页
- [2009.03.22 21:37:00] 肖申克的救赎-The Shawshank
- 洛谷 P1120 小木棍 题解
- 2021年度总结 | 葡萄城软件开发技术回顾(下)
热门文章
- IDEA不能下载插件
- winform php 交互,WinForm开发,窗体显示和窗体传值
- python输出不重复的单词_Python情感分析(比较单词时,不计算文本中重复的单词)...
- C语言 typedef - C语言零基础入门教程
- win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项
- ensp删除所有命令_HCIA学习笔记——eNSP配置NAT技术
- python能做数据库开发吗_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...
- w7计算机的收藏夹里弄出桌面,Win7电脑桌面的便签怎么弄出来?
- android 移除fragment,Android Viewpager+Fragment取消预加载及Fragment方法的学习
- 只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!