![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java锁
文章平均质量分 85
北海冥鱼未眠
道路在身旁!
展开
-
关于Semaphore信号量的源码解读
非公平锁,因为在对列中排队的线程,只有头结点的后继节点有资格可以获取锁,而在获取许可证时,有其他的线程(不是同步对列中的线程)进入,尝试去获取许可证,这两个线程都有可能获取到许可证,这就是非公平锁的特点。从上面的分析中可以看到,多态的特性,很多方法在执行的时候并不是我们直接点的进去的,而是根据实际的类型觉得调用哪些方法,所以分析的时候千万不要只是点进去某个方法,不然运行的时候可能不是这个方法。公平锁,就是只有队首的节点线程,可以获取许可证,有其他的线程在获取许可证时,会被加入到队尾,等待获取锁。...原创 2022-08-15 00:41:07 · 184 阅读 · 0 评论 -
synchronized的原理
对于一个Java对象都有一个对象头,对象头中有一个MarkWord变量,在一个线程在对一个对象使用synchronized的时候,会先看这个对象的MarkWord有没有被其他线程引用,没有的话,在jdk1.6的时候引入了偏向锁,这个时候就会在对象头的这个变量上写入线程id,这样就不会对MarkWord进行cas操作(将对象头改成新的锁记录的地址),避免了资源的开销。从上面的结果中可以看到对象的锁状态发生了重新的偏向,其他的都是轻量级锁,而后面发生了撤销偏向锁,所以后面对象锁状态变成了原来的偏向锁的状态。原创 2022-06-13 11:38:44 · 374 阅读 · 0 评论 -
ReentrantLock的实现
获取锁成功分为两种情况,第一个if判断AQS的state是否等于0,表示锁没有人占有。接着,没有的话调用compareAndSetState使用CAS(Unsafe类调用本地方法)的方式修改state,传入的acquires写死是1。最后线程获取锁成功,setExclusiveOwnerThread将线程记录为独占锁的线程。第二个if判断当前线程是否为独占锁的线程,因为ReentrantLock是可重入的,线程可以不停地lock来增加state的值,对应地需要unlock来解锁,直到state为零。与no原创 2022-06-13 11:13:55 · 162 阅读 · 0 评论 -
volatile关键字
volatile要求掌握线程安全要考虑的三个问题掌握 volatile 能解决哪些问题原子性起因:多线程下,不同线程的指令发生了交错导致的共享变量的读写混乱解决:用悲观锁或乐观锁解决,volatile 并不能解决原子性可见性起因:由于编译器优化、或缓存优化、或 CPU 指令重排序优化导致的对共享变量所做的修改另外的线程看不到,其实这个共享变量也已经同步到主内存了,关于另外一个线程看不到的原因,涉及到JIT的知识,参考文章。解决:用 volatile 修饰共享变量,能够防止编译器对原创 2022-03-04 12:31:07 · 112 阅读 · 0 评论 -
lock和synchronized对比
lock中的condiction可以指定某一个线程的执行,condition的await方法会释放锁。condition内部维护了一个 等待队列,所有调用condition.await方法的线程会加入到等待队列中,并且线程状态转换为等待状态。如果该线程能够从await()方法返回的话一定是该线程获取了与condition相关联的lock。CAS解决ABA问题:(带版本号的原子操作),可以通过循环实现乐观锁。使用CAS实现锁,底层使用的是Unsafe类,能够保证原子性操作。原创 2022-03-04 11:08:07 · 155 阅读 · 0 评论