并发编程01(Lock Condition 生产者消费者)详细讲解

并发

并发编程∶并发、并行 
并发(多线程操作同一个资源)
CPU一核,模拟出来多条线程,天下武功,唯快不破,快速交替并行(多个人一起行走) 
CPU 多核,多个线程可以同时执行;

public class QuickSort {public static void main(String[] args) {//获取cpu核数System.out.println(Runtime.getRuntime().availableProcessors());}

线程有六种状态

线程wait 和 sleep的区别

  • wait:会释放锁   sleep会抱着锁睡不释放
  • wait:  sleep:在任何地方睡
  • wait:不会捕获异常  sleep:必须要捕获异常

代码来展示并发(传统Synchronized)

public class QuickSort {public static void main(String[] args) {//并发,多个线程操作一个资源类 把资源丢入线程Ticket tic=new Ticket();//Lambda表达式(参数)->{代码}
/*        new Thread(new Runnable() {@Overridepublic void run() {}}).start();*/new Thread(()->{for (int i = 0; i < 60; i++) {tic.sale();}},"A").start();new Thread(()->{for (int i = 0; i < 60; i++) {tic.sale();}},"B").start();new Thread(()->{for (int i = 0; i < 60; i++) {tic.sale();}},"C").start();}
}
class Ticket{private int number =50;public  synchronized void sale(){if(number>0){System.out.println(Thread.currentThread().getName()+"卖出了"+number--+"剩下"+number);}}
}

  

Lock

 

 

公平锁:十分公平 可以分先来后到

非公平锁: 十分不公平 可以插队

public class QuickSort {public static void main(String[] args) {//并发,多个线程操作一个资源类 把资源丢入线程Ticket tic=new Ticket();new Thread(new Runnable() {@Overridepublic void run() {}}).start();new Thread(()->{for (int i = 0; i < 60; i++) {tic.sale();}},"A").start();new Thread(()->{for (int i = 0; i < 60; i++) {tic.sale();}},"B").start();new Thread(()->{for (int i = 0; i < 60; i++) {tic.sale();}},"C").start();}
}
/*Lock三部曲1  new ReentrantLock();2  新ReentrantLock()3  finaLly=> lock. unLock(); (/解锁*/
class Ticket{private int number=50;Lock lock=new ReentrantLock();public  void sale(){lock.lock();if(number>0){System.out.println(Thread.currentThread().getName()+"卖出了"+number--+"剩下"+number);}lock.unlock();}
}

结果

  Synchronized和Lock区别

  • Synchronized内置的Java关键字,Lock是一个Java类 
  • Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁
  • Synchronized 会自动释放锁,lock必须要手动释放锁!如果不释放锁,死锁
  • Synchronized线程1(获得锁,阻塞)、线程2(等待,傻傻的等)
  • Synchronized可重入锁,不可以中断的,非公平;Lock,可重入锁,可以判断锁,非公平(可以自己设置); 同步可重入锁,不可以中断的,非公平;锁,可重入锁,可以判断锁,非公平(可以自己设置);

什么是锁

生产者和消费者问题

 

代码

public class QuickSort {public static void main(String[] args) {Data data=new Data();new Thread(()->{try {data.printA();} catch (InterruptedException e) {throw new RuntimeException(e);}},"A").start();new Thread(()->{try {data.printB();} catch (InterruptedException e) {throw new RuntimeException(e);}},"B").start();new Thread(()->{try {data.printC();} catch (InterruptedException e) {throw new RuntimeException(e);}},"C").start();}
}
class Data{private Lock lock=new ReentrantLock();//监视器conditionprivate Condition condition =lock.newCondition();private Condition condition1 =lock.newCondition();private Condition condition2 =lock.newCondition();private int number=1;public void printA() throws InterruptedException {lock.lock();//业务 判断-》执行-》通知while (number!=1){//等待condition.await();}System.out.println(Thread.currentThread().getName()+"A");number=2;condition.signal();lock.unlock();}public void printB() throws InterruptedException {lock.lock();//业务 判断-》执行-》通知while (number!=2){//等待condition1.await();}System.out.println(Thread.currentThread().getName()+"B");number=3;condition.signal();lock.unlock();}public void printC() throws InterruptedException {lock.lock();//业务 判断-》执行-》通知while (number!=3){//等待condition2.await();}System.out.println(Thread.currentThread().getName()+"C");number=1;condition.signal();lock.unlock();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/90124.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在编辑器中使用正则

正则是一种文本处理工具&#xff0c;常见的功能有文本验证、文本提取、文本替换、文本切割等。有一些地方说的正则匹配&#xff0c;其实是包括了校验和提取两个功能。 校验常用于验证整个文本的组成是不是符合规则&#xff0c;比如密码规则校验。提取则是从大段的文本中抽取出…

使用通信顺序进程(CSP)模型的 Go 语言通道

在并发编程中&#xff0c;许多编程语言采用共享内存/状态模型。然而&#xff0c;Go 通过实现 通信顺序进程&#xff08;CSP&#xff09;模型来区别于众多。在CSP中&#xff0c;程序由不共享状态的并行进程组成&#xff1b;相反&#xff0c;它们通过通道进行通信和同步操作。因此…

知识图谱(1)知识存储与检索

目录 Neo4j在win系统安装Neo4j基础语法知识图谱创建知识图谱查询知识图谱属性增减 python与neo4j Neo4j在win系统安装 图数据库&#xff08;graph database&#xff09;是一种特殊的数据库&#xff0c;用于存储丰富的关系数据&#xff0c;neo4j是目前最流行的图数据库&#xf…

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…

前端:横向滚动条,拖动进行左右滚动(含隐藏滚动条)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

universal robot 机械臂 官方基本教程

https://academy.universal-robots.cn/modules/e-Series-core-track/Chinese/module3/story_html5.html?courseId2166&languageChinese 教程1 控制箱内部 包含&#xff1a; 主机板&#xff0c;SD卡&#xff0c;和安全控制板 安全控制板负责所有控制信息&#xff0c;包括…

Android JNI系列详解之CMake编译工具的使用

一、CMake工具的介绍 如图所示&#xff0c;CMake工具的主要作用是&#xff0c;将C/C编写的native源文件编译打包生成库文件&#xff08;包含动态库或者静态库文件&#xff09;&#xff0c;集成到Android中使用。 二、CMake编译工具的使用 使用主要是配置两个文件&#xff1a;CM…

nodepad++ 插件的安装

nodepad 插件的安装 一、插件安装二、安装插件&#xff1a;Json Viewer nodepad 有 插件管理功能&#xff0c;其中有格式化json以及可以将json作为树查看的插件&#xff1a; Json Viewer 一、插件安装 1、首先下载最新的notepad 64位【https://notepad-plus.en.softonic.com…

echart 图表添加数据分析功能,(右上控制选择)

echart 图表添加数据分析功能,可区域选择数据,右上按钮,控制echart行为 chart.on(globalcursortaken, onGlobalcursortaken); //绑定事件chart.off("brushSelected");//解绑事件处理函数chart.on(brushSelected, renderBrushed);getBarDev2(eIndex, eTimeArr, eSerie…

最新ChatGPT程序源码+AI系统+详细图文部署教程/支持GPT4.0/支持Midjourney绘画/Prompt知识库

一、AI系统 如何搭建部署人工智能源码、AI创作系统、ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Mi…

流媒体弱网优化之路(BBR应用)——GCC与BBR的算法思想分析

流媒体弱网优化之路(WebRTC)——GCC与BBR的算法思想分析 —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全配置&…

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1,碰撞形状与视觉形状 像立方体和球体这样的简单形状,通常被称为“基本体”,通常用作碰撞块。 与…