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多线程解决同步问题的几种方式,原理和代码相关推荐

  1. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

  2. JAVA中的arraylist集合_java中遍历ArrayList集合的四种方式

    详细内容 ArrayList遍历:取出ArrayList集合中的数据 方式一:for循环 方式二:增强for循环:foreach 方式三:Iterator:迭代器 方式四:ListIterator:双 ...

  3. java 连接mongodb 集群_Java 连接MongoDB集群的几种方式

    先决条件 先运行mongodb肯定是必须的,然后导入以下包: import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; im ...

  4. java 循环依赖_浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  5. java如何显示当天世界_Java学习笔记——显示当前日期的三种方式

    一.Date类:这是一种过时的表达方式 import java.util.Date;Date date = new Date(); System.out.println((1900+date.getY ...

  6. java中的map对象_java中遍历Map对象的四种方式

    import java.util.HashMap; import java.util.Map; /** * 遍历Map对象 * @author xiaosongsong: * @CreateTime ...

  7. java自定义拦截所有请求_Java实现拦截HTTP请求的几种方式

    在Java的服务端开发当中,拦截器是很常见的业务场景,这里对Java开发当中几种常见的拦截器的实现方式进行记录和分析.案例说明基于Spring Boot环境. 一:实现javax.servlet.Fi ...

  8. java set去重复元素_java List去掉重复元素的几种方式

    使用LinkedHashSet删除arraylist中的重复数据(有序) List words= Arrays.asList("a","b","b&q ...

  9. java list 去重复元素_java List去掉重复元素的几种方式

    使用LinkedHashSet删除arraylist中的重复数据(有序) List words= Arrays.asList("a","b","b&q ...

  10. SpringBoot解决跨域的5种方式

    本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...

最新文章

  1. 17. 搭建FTP服务端
  2. 通过调用门进行控制转移 ——《x86汇编语言:从实模式到保护模式》读书笔记29
  3. android adb 联系人,使用adb命令向Android模拟器中导入通讯录联系人的方法
  4. Log4j的快速入门
  5. 语言三做一年级算题_一年级数学期末考试,学生交卷说能考100分,快让你家孩子试试吧...
  6. 第 4 章(表达式和运算符)(4.1~ 4.7)
  7. SQLAlchemy engine.Engine
  8. 三角网导线平差实例_导线三角网平差计算中的Wd是什么意思啊?怎么的算出来的?...
  9. 几种简单的图像加密方法
  10. 【语音识别入门】Python音频处理示例(含完整代码)
  11. Jlink修复指南step by step指导(实践成功) 更新 适用win7-10
  12. Arcgis进行人口密度计算
  13. 线性不可分转可分----低维空间转高维空间
  14. NXP LPC1768最小系统板Keil开发环境流程演示
  15. 承认多元化,保持宽容
  16. OpenCvSharp人脸识别系统(视频中的人脸)
  17. Scroll View到达底部加载新页
  18. [2009.03.22 21:37:00] 肖申克的救赎-The Shawshank
  19. 洛谷 P1120 小木棍 题解
  20. 2021年度总结 | 葡萄城软件开发技术回顾(下)

热门文章

  1. IDEA不能下载插件
  2. winform php 交互,WinForm开发,窗体显示和窗体传值
  3. python输出不重复的单词_Python情感分析(比较单词时,不计算文本中重复的单词)...
  4. C语言 typedef - C语言零基础入门教程
  5. win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项
  6. ensp删除所有命令_HCIA学习笔记——eNSP配置NAT技术
  7. python能做数据库开发吗_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...
  8. w7计算机的收藏夹里弄出桌面,Win7电脑桌面的便签怎么弄出来?
  9. android 移除fragment,Android Viewpager+Fragment取消预加载及Fragment方法的学习
  10. 只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!