synchronized 底层实现原理
线程在获取锁的时候,其指针指向的是一个monitor对象(由C++实现)的起始地址。每个对象实例都会有一个 monitor。其中monitor可以与对象一起创建、销毁;亦或者当线程试图获取对象锁时自动生成。而monitor是添加Synchronized关键字之后独有的。synchronized同步块使用了monitorenter和monitorexit指令实现同步,这两个指令,本质上都是对一个对象的监视器(monitor)进行获取,这个过程是排他的,也就是说同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。 线程执行到monitorenter指令时,会尝试获取对象所对应的monitor所有权,也就是尝试获取对象的锁,而执行monitorexit,就是释放monitor的所有权。
Lock完全用Java写成,synchronized 是JVM实现的。
一定要这么写,不然有问题
trylock:
第二个线程如果超过5秒,就获取失败
如果第二个线程没有获取锁,unlock的时候,会报错,所以要加个if
如果第二个线程5秒内没有获取锁,中断
trylock与lock区别,trylock如果获取不到,就不获取了,lock则不是
sysnchroized与reentrantlock区别
syschronized jvm级别,重入
reentrantlock 手动,重入,lock指令, condition
与读写锁reentrantreadwritelock区别 细粒度问题
生产者消费者
condition:线程池队列用的就是condition
最底层的核心类
reentrantlock 锁的底层实现就是这个类abstractQueuedSynchronizer
队列+双向链表.
abstractQueuedSynchronizer 简称aqs同步器
非公平锁
countdownlatch
CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。
CountDownLatch 在 JDK 1.5 被引入。
存在于 java.util.concurrent 包下。
例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有框架服务之后执行。
在这里插入图片描述
场景,等远程接口执行完了,再执行我的业务,就是依赖调用
用来做限流,并发限流
分布式限流 redis+lua
第二章
可以做订单号生成
原子性的底层是cas
嗅探机制,可以理解为类似于监听器,
hashp map
链表大于8的时候,才会变红黑树
hashtable与currenthashmap
都是线程安全
但是,底层不一样,
hashtable put的时候是synchrnized
currenthashmap 1.7分段锁
linkarraylist 双向链表
add方法 带锁,线程安全
get没有锁,get老值,所以不用,
线程池
schedule方法 定时任务 5秒后执行
schedulatfixedrate 会一直执行run方法
submit底层也是调用execute方法
线程执行顺序用join
懒汉模式线程不安全,可以用volitiel修饰,就可以解决