- 博客(8)
- 收藏
- 关注
原创 ReentrantReadWriteLock的实现原理
解决的方式是队列,我在读之前,先进队列找,是否有写操作在排队,如果有,那么我也进入队列排队。首先依旧需要靠AQS的核心state属性,int类型的,只不过,因为我们现在有两把锁,一把读锁一把写锁,所以我们要把int拆开来用,那么在java中,int是32位的,我们将低16位用来记录写锁,高16位用来记录读锁。那么解决了这个问题之后,我们再来看一个问题,如果我现在要写的话,那么我就需要等待读操作都执行完,此时如果读的并发非常高,一直有读操作进入,我就没法写了?因为并发读是不会造成一个安全问题的。
2024-01-08 16:15:00
344
原创 ReentrantLock和synchronized的区别
但是ReentrantLock在使用上,要更加的灵活一点,因为他可以由我们自己控制,所以他能实现一些额外的功能,比如查看锁的状态,尝试获取锁,获取不到就返回,再或者我可以让他在一定时间内自己重试去获取锁,这些synchronized是做不到的。上讲的话,synchronized会更高,因为ReentrantLock他是完全由java来实现的,该做的优化都已经做了,而synchronized是基于操作系统实现的,他存在更大的进步空间,因为操作系统的操作权限更大,能和硬件做的联动也更多。
2024-01-08 15:44:43
283
原创 JDK1.6对synchronized的优化
首先一上来,他是一个无锁的状态,当有线程获得锁了,那么升级为偏向锁,偏向锁也还没有真正的上锁,他在对象头上,记录持有线程的ID,然后下次过来,先比较ID,如果是同一个线程ID,则直接放行,这个过程没有上锁解锁操作。所以注意了,并不是任何时候CAS争抢都要比重量级锁好的,CAS自旋的时候,消耗了CPU资源,但是大部分时间其实是空转的一个情况,因为你抢不到锁,10个线程同时争抢,只有1个线程抢成功,其他9个就必须自旋。这个也是JIT来做的优化,他会在不影响代码正常业务的情况下,把锁住的代码范围提高。
2024-01-08 14:23:52
411
原创 Java锁的分类
我在写的时候,我是需要上互斥锁的,就是说,同一时刻,只能有一个线程来写。非公平锁是说,假设A线程在使用资源,B线程在排队,那么此时C线程进入,我先去抢这个锁,如果抢到了,我就直接使用,否则才去排队,这里就会存在一个插队操作,假设此时A线程释放了锁,还没来得及唤醒B线程,则C就插队成功了。可重入锁是说,我一个线程A,他获取了锁B,在执行业务的过程中,再次去获取锁B,这个是被允许的,锁B内部会有一个持有次数,获取一次就+1,那么解锁的时候,也需要解两次,才能释放掉这个锁。而CAS操作,就是乐观锁。
2024-01-08 13:02:34
305
原创 ThreadLocal和ThreadLocal的内存泄漏问题
第二个泄漏点,是value泄漏,当key清理了,那么我如何访问这个v呢?他存在两个内存泄漏点,第一个是key值会泄露,也就是我这个ThreadLocal对象用完了,以后不用了,但是我的线程还没有结束,那么这个ThreadLocal也就不能被回收,他的解决方法是将ThreadLocal对象设置为弱引用对象,也就是触发GC了,就清理。我们可以把他理解成一个工具,通过他来帮助我们操作Thread中ThreadLoacalMap,注意哈,我们存的数据是存在Thread中的,不是存在ThreadLocal里面的!
2024-01-05 18:00:55
315
1
原创 java中是四种引用类型
最后是虚引用,它无法单独使用,需要配合队列,虚引用主要是用来跟踪对象被垃圾回收的状态。当队列使用完毕将要销毁,我们就会判断是否存在虚引用,存在的话,就会去触发finalize方法,你可以理解成这个对象的临终遗言。而弱引用,则更进一步,只要我开始GC,不管我内存是否充足,你就必须被回收掉(如果一个对象有弱引用之外,还有一个强引用指向,那么他不会被回收)。我们经常用的 new就是强引用,只要这个引用还存在,那么此对象,就不会被垃圾回收。而软引用,则是当系统没有内存了,需要垃圾回收了,就会清理掉这部分对象。
2024-01-05 17:43:27
376
1
原创 什么是CAS,有什么优缺点?
缺点就是会有ABA问题,也就是我在执行的过程中,别人先把a改成了8,然后又改回了0,此时我的判断依旧是成功的,但实际上此0非彼0,这个问题的解决方法我载额外增加一个版本号,我根据这个版本号来判断,我不管目标值是多少,我只要操作这个值,就让版本号+1,最后比较这个版本号就可以了,你改了8又改回0,那么版本号就会+2,那么就和我手上的版本号不一致了。当然,这个必然会出现非常多的失败的情况,比如10个线程同时操作,那么那一刻只有1个线程是成功的,另外9个是失败的,但是也比上锁时的线程切换消耗的性能要低。
2024-01-05 17:32:04
337
1
原创 通俗易懂的解释——面向对象的三大特征
此文章仅代表本人的理解,且语言描述并不会循规蹈矩,我会尽可能用人话来讲解我所理解的内容。面向对象的三大特征:封装、继承、多态相信你们都已经听到耳朵起茧了。那么他们到底是个什么意思呢?
2023-09-21 21:32:29
144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人