![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 89
黑木爷
这个作者很懒,什么都没留下…
展开
-
Java synchronized锁升级过程验证
我们先介绍下锁升级过程。JD6之后分为无锁,偏向锁,轻量级锁,重量级锁。其中偏向锁->轻量级锁->重量级锁的升级过程不可逆。偏向锁:当一个线程第一次获取到锁之后,再次申请就可以直接取到锁核心思想:一开始无锁状态,JVM会默认开启“匿名”偏向的一个状态,就是一开始线程还未持有锁的时候,就预先设置一个匿名偏向锁,等一个线程持有锁之后,就会利用CAS操作将线程ID设置到对象的mark word 的高54位上【64位虚拟机】。......原创 2022-08-28 12:02:51 · 167 阅读 · 0 评论 -
Java AQS锁实现原理
最后,我想说的是,AQS的实现思想并不仅仅局限于在读写锁中使用,在很多Java中间件、JVM以及操作系统中都有运用,包括其他语言中也有运用。判断队列中有没有其他线程在等待锁,或者当前线程是第一个在等待锁的线程,也就是等待队列中第一个线程,然后CAS尝试修改锁状态,设置当前线程为锁拥有者。从代码实现上看,能看到的变量几乎都是volatile的,能看到的方法几乎都是CAS或者Unsafe类的原子方法。这几个方法是使用AQS类的关键,只有这几个方法是可以定制的,其他方法几乎都是final的,不可修改。......原创 2022-08-14 14:03:28 · 448 阅读 · 0 评论 -
java序列化导致的问题
最近在做一个需求的迭代过程中,遇到了一个tair(公司的一款缓存中间件,类似Redis)反序列化失败的问题,也就是把tair里缓存的值转换成对象的时候报错了。看了一下代码里tair的使用,put的时候value是对象本身,get的时候是把tair获取到的对象进行类型强制转换,类似这种:Person person = new Person();person.setWorkNo("123");person.setName("张三");tairManager.put原创 2022-06-20 21:31:00 · 1000 阅读 · 1 评论 -
spring事务和对象锁
对象锁(Lock/synchronized)的注意点:1.对象锁可能锁住的范围比较大,导致接口性能下降,造成线程阻塞;2.对象锁的唯一性问题,如果不是全局唯一锁(使用spring容器对象或static对象只能保证同一服务器唯一,不能保证全局唯一),将起不到锁的作用,最好使用分布式锁;spring事务:spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以原创 2017-04-28 10:11:52 · 2465 阅读 · 0 评论 -
同步异步和阻塞非阻塞的区别
同步异步关注的是线程调用时的消息通知机制:同步:线程需要获得调用结果,未获得结果前一直处于等待状态,一旦获得结果立即返回;异步:线程不需要获得调用结果,调用后立即返回,由被调用者通知调用者结果;阻塞非阻塞关注的是线程等待调用结果时的状态:阻塞:当前线程在等待调用结果时被挂起,不再执行其他操作;非阻塞:当前线程在等待调用结果时不被挂起,可以执行其他操作;原创 2017-04-28 10:13:11 · 316 阅读 · 0 评论 -
Callable和Runnable用法和比较
比较:Callable有返回值并且可以抛异常;Runnable无返回值并且不能抛异常。FutureTask和Future:Future:接口,用于获得任务的执行结果。Future的get方法获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 FutureTask:实现类,实现了RunnableFuture接原创 2017-04-28 10:52:06 · 588 阅读 · 0 评论 -
log4j
架构:包括核心对象和支持对象核心对象: |----Logger:用于获取日志信息 |---- Appender:确定日志存放目的地,比如数据库、文件、控 制台、Unix Syslog 等 • AppenderSkeleton • AsyncAppender • ConsoleAp原创 2017-04-28 10:52:52 · 221 阅读 · 0 评论