线程

Synchronized

每个对象都有一个对象头,对象头内有当前对象的锁状态,有多个标记位,包括偏向、轻量、重量
每个对象对应一个monitor对象,主要有四个属性

ObjectMonitor() {
_count = 0; // 记录个数
_owner = NULL;//当前持有锁的线程引用,用它判断重入
_WaitSet = NULL; // 处于wait状态的线程,会被加入到_WaitSet
_EntryList = NULL ; // 处于等待锁block状态的线程,会被加入到该列表
}
线程获取锁时首先进入entryList判断是否有等待线程,没有等待的就把当前线程设置为持有锁的线程,并计数+1
当线程发现条件不满足时,调用wait,线程将释放持有锁,即将计数归零owner引用置空,当前线程进入waitSet,无参wait()时线程状态为WAIT,带参wait(10)线程状态为TIMED_WAITING
当其他线程调用notify时,会从waitSet中取出一个,并判断是否能获取到锁,如果竞争锁失败则加入entrySet,线程状态为BLOCKED
这里注意,当线程调用sleep时,线程也是TIMED_WAITING状态,只不过不会释放锁(修改计数、引用置空、进入等待队列)
同步代码块会在编译时加入MonitorEnter、MonitorExist指令,执行到MonitorEnter时将获取对象锁,执行到MonitorExist时将释放锁

Thread里的State枚举共6种 NEW(新建)、RUNNABLE(运行)、BLOCKED(锁池)、TIMED_WAITING(定时等待)、WAITING(等待)、TERMINATED(终止、结束)

join

thread的join本质上就是wait和notify
线程B中 线程A.join,join方法本身是个同步方法,相当于获取到线程A对象的锁,随后调用wait,线程B将进入等待队列,当线程A执行完毕后,会notifyall
所有等待该线程对象的线程(这一步是jvm自己做的,不是程序代码写的)

ThreadLocal

每个Thread对象内部都有一个ThreadLocalMap类型属性,Entry类型的数组,仅是一个数组,默认16,超过12就扩容,key为ThreadLocal的软引用,这就是为啥这是个数组,因为Thread里面可以存多个ThreadLocal!
ThreadLocal.get时首先获取当前线程,然后再在线程对象里获取ThreadLocalMap,ThreadLocal的get和set都是针对key的哈希值(get时候传递this作为key,即当前ThreadLocal的hash值),这个hash值计算用了特殊方式,ThreadLocal类里有一个static类型的AtomicInteger,类属性类型,被所有对象共享,每当创建一个对象时,这个数就加上一个固定值,所以每个Threadlocal对象的hash值都是固定且有规律递增的,这个数比较特别,最终目的是为了更好的散列。
为什么要用虚引用,如果用了强引用,当threadlocal不需要了设置为null,如果还是强引用将一直不会回收

应用场景
框架内,spring事务,本质就是当前线程与连接对象绑定,new传播级别本质上就是新建一个连接,并与当前线程绑定,当前线程在本事务内执行的操作都是这个连接,执行完后线程重新绑定旧连接
应用内,流水号传递、

spring事务方法调用本类事务方法为什么不会产生传播,或者说代理对象内部方法调用为什么不增强?

因为本类方法互相调用使用的并不是代理对象那个方法,想要增强也可以,不能直接mA -> this.mB改成getProxy.mB
spring可以开启"expose-proxy=true"(暴露代理对象)然后改变一下写法AopContext.currentProxy().mB()
代理类
sayHello(String agr1){
super.handler.invoke(this,m3,new Object[]{arg1});
}
class handler im InvocationHandler{
Object target;
public Object invoke(Object proxy, Method method, Object[] args) {
return method.invoke(target,args);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值