当前位置:网站首页>JUC (1) threads and processes, concurrency and parallelism, thread state, locks, producers and consumers
JUC (1) threads and processes, concurrency and parallelism, thread state, locks, producers and consumers
2022-08-04 10:31:00 【51CTO】
1、线程和进程
- 进程:一个程序,微信、qq、、、程序的集合.(一个进程包含多个线程,至少包含一个线程.java默认有两个线程:主线程(main)、垃圾回收线程(GC)
- 线程:runnable、thread 、callable
java开不了线程,在源码中可以看出,调用的是底层的方法
2、并发和并行
- 并发:交替
- 并行:同时(同一个时间)
并发编程的本质:充分利用cpu的资源
3、线程的状态
看源码
- 新生
- 运行
- 阻塞
- 等待,(死死的等)
- 超时等待
- 终止
4、sleep和wait的区别
- sleep来自thread.wait来自object
- wait会释放锁,sleep不会释放锁
- wait只能在同步代码块中,sleep可以在任意地方睡
5、Lock锁
Lock接口
public interface Lock
Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作. 它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition .
锁是用于通过多个线程控制对共享资源的访问的工具. 通常,锁提供对共享资源的独占访问:一次只能有一个线程可以获取锁,并且对共享资源的所有访问都要求首先获取锁. 但是,一些锁可能允许并发访问共享资源,如ReadWriteLock的读锁.
使用synchronized方法或语句提供对与每个对象相关联的隐式监视器锁的访问,但是强制所有锁获取和释放以块结构的方式发生:当获取多个锁时,它们必须以相反的顺序被释放,并且所有的锁都必须被释放在与它们相同的词汇范围内.
虽然synchronized方法和语句的范围机制使得使用监视器锁更容易编程,并且有助于避免涉及锁的许多常见编程错误,但是有时您需要以更灵活的方式处理锁. 例如,用于遍历并发访问的数据结构的一些算法需要使用“手动”或“链锁定”:您获取节点A的锁定,然后获取节点B,然后释放A并获取C,然后释放B并获得D等. 所述的实施方式中Lock接口通过允许获得并在不同的范围释放的锁,并允许获得并以任何顺序释放多个锁使得能够使用这样的技术.
synchronized和lock的区别
- 1、synchronized内置的java关键字,lock是一个java类
- 2、synchronized 无法判断获取锁的状态,lock锁可以判断是否获取到了锁
- 3、synchronized会自动释放锁,lock必须要手动释放锁,如果不释放锁,死锁
- 4、synchronized 线程1获得锁,阻塞,线程2 傻傻的等.lock锁就不一定会等下去;会试图获取锁
- 5、synchronized 可重入锁,不可以中断,非公平:lock,可重入锁可以判断锁,非公平
- 6、synchronized 适合锁少量的代码同步问题,lock适合锁大量的同步代码
6、买票问题
7、生产者和消费者问题
8、使用condition替换synchronized
修改后的代码
测试结果
边栏推荐
猜你喜欢
随机推荐
LeetCode中等题之旋转图像
ROI LTV CPA ECPM体系讲解
HCIP 第十七天
常用的输入对象
参数优化文档介绍
js文字转语音播报
移动端 开源低代码工具 beeware 和 kivy
pyvista 的介绍与使用
Jina 实例秀|七夕神器!比你更懂你女友的AI口红推荐
无代码平台描述文字入门教程
Win11如何隐藏输入法悬浮窗?
暴力破解-破解 Apache BASIC 认证
XCTF-reverse-signin
无线Mesh自组网方案,CV5200无线模组应用,支持高清数据远距离传输
再次搞定 Ali 云函数计算 FC
二叉树与堆
Win10电脑经常发出叮咚声音怎么关闭
华为开源:聚焦开源基础软件,共建健康繁荣生态
OD-Model【5】:YOLOv1
数据万象内容审核 — 共建安全互联网,专项开展“清朗”直播整治行动