【尚硅谷】大厂必备技术之JUC并发编程



管程(monitor)是保证了同一时刻只有一个进程在管程内活动,即管程内定义的操作在同一时刻只被一个进程调用(由编译器实现).但是这样并不能保证进程以设计的顺序执行
JVM 中同步是基于进入和退出管程(monitor)对象实现的,每个对象都会有一个管(monitor)对象,管程(monitor)会随着 java 对象一同创建和销毁 执行线程首先要持有管程对象,然后才能执行方法,当方法完成之后会释放管程,方法在执行时候会持有管程,其他线程无法再获取同一个管程
setDamon(true)
所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

·原子性:其实之前诗过很多次了,就怎要做什么事情菠么做完,要么就不做,不存在做一半的情况。
·可见性:指当多个线程访问同一个变帚时,一个线程修改了这个变量的值,其他线程能够立即看得到格改的值,
·有序性:即程序抗行的顺序按照代码的先后顺序执行,


虚假唤醒




多个condition 可以定制通信

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

Abstract Queued Synchronize 抽象同步队列

尝试枷锁 没有所过

如果是自己的重复枷锁




找一个类,既和Runnable有关系,又和Callable也有关系
Runnable接口有实现类FutureTask
FutureTask构造可以传递Callable




悲观锁与乐观锁


mysql 版本号
CAS 操作中包含三个操作数 —— 需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。
CAS 有效地说明了“ 我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。 ”这其实和乐观锁的冲突检查+数据更新的原理是一样的。
读写锁的优点:
- 提高并发性能:读写锁允许多个线程同时进行读操作,从而提高了多线程环境下读操作的并发性能。
- 减少锁竞争:相比于使用互斥锁实现并发控制,读写锁可以减少锁竞争,因为多个线程可以同时获取读锁,不必相互等待。
- 数据完整性:读写锁可以保证在写操作时具有排他性,防止多个线程同时修改共享数据导致数据不一致。
读写锁的缺点:
- 写操作优先级高:由于写操作会破坏共享数据的完整性,因此需要等待所有的读操作完成后才能执行写操作,这可能导致写操作的等待时间较长。
- 可能出现饥饿:如果写操作频繁,可能会导致读操作一直等待,从而出现饥饿现象,即某些线程被长期阻塞无法执行。



