当前位置: 首页 > news >正文

线程自动退出_Java开发课程(十八)——多线程 2、多线程编程

多线程编程

0d125fde44e38d97ce33142d9af8c018.png
  • 线程同步

1、为什么需要同步

一线程同步是为了防止多个线程访问一个数据对象时,对数据造成破坏线程的同步 是保证多线程安全访问竞争资源的一种手段。

2、同步和锁定

一Java中每个对象都有一个内置锁。

一当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类 的当前实例(this实例)有关的锁;当程序运行到synchronized同步代码块时, 自动获得锁定对象的锁。

一获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。当 程序运行到synchronized同步方法或代码块时该对象锁才起作用。

一一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得 锁,直到第一个线程释放锁。这也意味着任何其他线程都不能进入 synchronized方法或代码块,直到该锁被释放。释放锁是指持锁线程退出了 synchronized同步方法或代码块。

3、对于同步,一般而言在java代码中需要完成两个操作:

一把竞争访问的资源标识为private。

一同步那些访问资源的代码,使用synchronized关键字同步方法或代码块。当 synchronized方法执行完或发生异常时,会自动释放锁。

4、同步产生死锁的原因

一当一个线程已经获取了对象1的锁,同时又想获取对象2的锁。而此时另一个线程当前已经持有了对象2的锁,而又想获取对象1的锁。这种互相等待对方释放锁的过程,会导致"死锁"。

  • 线程通信

1、在现实应用中,很多时候需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题:

一这类问题描述了这样一种情况,假设仓库中只能存放一件产品,生产者将生产出 来的产品放入仓库,消费者将仓库中的产品取走消费。如果仓库中没有产品,则 生产者可以将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者 取走为止。如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费 并等待,直到仓库中再次放入产品为止。

一显然,这是一个同步问题,生产者和消费者共享同一资源,并且,生产者和消费 者之间彼此依赖,互为条件向前推进。

2、该如何编写程序来解决这个问题呢?

3、传统的思路是利用循环检测的方式来实现,通过重复检查某一个特定条件是否成立来决定线程的推进顺序

一比如,一旦生产者生产结束,它就继续利用循环检测来判断仓库中的产品是否被 消费者消费,而消费者也是在消费结束后就会立即使用循环检测的方式来判断仓 库中是否又放进产品。

一显然,这些操作是很耗费CPU资源的,不值得提倡。

4、有没有更好的方法来解决这类问题呢?

5、Java提供了3个重要方法巧妙解决线程间的通信问题。这3个方法分别是:wait()、notify()和notifyAll()。

6、调用wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒。

7、调用notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使以线程退出等待队列,进入可运行态。

8、调用notify0方法可以使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,此时,优先级最高的那个线程最先执行。

  • 课程内容

1、线程同步

2、线程通信

相关文章:

  • 图像条纹检测 python_衍射时差法超声波检测(TOFD)告诉你焊接缺陷到底是什么样的!...
  • python一元二次方程表达式_Python实现求解一元二次方程的方法示例
  • python并发和并行_python并发编程(并发与并行,同步和异步,阻塞与非阻塞)
  • oracle rds 运维服务_我应该为无服务器应用程序选择哪个数据库?
  • cmd传入命令行打开程序_CMD命令行中以管理员权限启动应用程序实现方法
  • gb和gib的区别_GB和GiB的区别
  • p6与project哪个软件好_多功能记事本软件哪个好?
  • python tensorflow教程推荐_有哪些学习python和tensorflow的书籍值得推荐呢?
  • 计算机网络课设telnet_修改windows的telnet默认根路径
  • centos7安装php5.2yum源操作_centos 7.4系统yum安装php最新版本php7.2
  • 笔记本卡顿不流畅是什么原因_电脑卡顿不流畅是什么原因?PC卡顿原来可以这么解决...
  • web前端行业调研报告_2015 年 JavaScript 开发者调查报告
  • centos7双机搭建_centos 7之keepalived双机热备理论+配置文件详解
  • uni 获取本地文件_uni-app 接口 - 从本地相册选择图片或使用相机拍照
  • oracle 日期改字符格式_oracle中的日期格式及和字符转换
  • [NodeJS] 关于Buffer
  • ➹使用webpack配置多页面应用(MPA)
  • laravel 用artisan创建自己的模板
  • MySQL主从复制读写分离及奇怪的问题
  • Odoo domain写法及运用
  • Python爬虫--- 1.3 BS4库的解析器
  • 爱情 北京女病人
  • 浅谈web中前端模板引擎的使用
  • 什么是Javascript函数节流?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 微信小程序开发问题汇总
  • 学习笔记TF060:图像语音结合,看图说话
  • 原生Ajax
  • raise 与 raise ... from 的区别
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #include到底该写在哪
  • $.ajax()参数及用法
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (差分)胡桃爱原石
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (力扣题库)跳跃游戏II(c++)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四) 虚拟摄像头vivi体验
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)甲方乙方——赵民谈找工作
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .dwp和.webpart的区别
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET基础篇——反射的奥妙
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /var/log/cvslog 太大
  • @ModelAttribute注解使用
  • @在php中起什么作用?
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬