
Java并发
眠秋雨
不要向前看,那里有怀疑;也不要向后看,那里有悔恨。
展开
-
Java并发-线程通信-浅析等待/通知机制+范式
等待/通知机制是指,一个线程A调用了对象O的wait()方法进入等待状态,另一个线程B调用对象O的notify()/notifyAll(),线程A收到通知后从对象O的wait()方法返回,进入执行后续的逻辑操作。上述两个线程是通过对象O来进行通信的。对象O的wait()和notify()方法的【关系】就像【一对开关信号】,用于完成等待方和通知方的交互操作。等待/通知范式等待方...原创 2022-04-10 21:15:00 · 242 阅读 · 0 评论 -
Java并发-Synchronized实现原理概述+Java对象头
每一个Java对象都可以作为锁。具体表现形式有3种:普通同步方法,锁就是当前实例对象。 静态同步方法,锁就是当前类的Class对象。 同步代码块,锁就是synchronized后括号里面配置的对象。线程在进入同步块时要获取锁,退出时或者抛出异常时要释放锁。那么这个锁到底是什么呢?锁又存储在哪呢?其实在Java中,每一个对象都关联着一个monitor,当且monitor被持有时,该对象被锁定。所以当线程进入同步块时,首先会尝试获取对象所对应的monitor的所有权,即尝试获取对象的锁。s原创 2022-04-10 19:45:00 · 173 阅读 · 0 评论 -
Java并发-线程的基本使用-park()与unpark()
suspend()与resume()是java作废的方法,但是如果你想要实现同样的功能,可以使用juc里面提供的LockSupport代替,效果是一样的。park()方法的作用是将线程暂停,unpark()方法的作用是恢复线程的运行。 如果先执行unpark()再执行park()方法,则park()方法不会有暂停的效果。...原创 2022-04-10 18:53:22 · 781 阅读 · 0 评论 -
Java并发-锁的对比与升级-浅谈轻量级锁
首先,先来说一下轻量级锁的应用场景,当一个锁被多个线程访问,但是多个线程访问的时间是错开的(也就是不存在竞争现象)的时候,我们可以使用轻量级锁来进行优化。 轻量级锁的加锁过程比较简单。首先,当一个线程访问同步块之前,JVM会在该线程的栈帧中开辟一块存储锁的记录的空间。该线程会将锁的Markword复制到锁记录中。然后该线程尝试使用CAS操作将对象头的Markword替换为指向锁记录的指针。如果替换成功,表示加锁成功;如果替换失败,表示有其他线程在竞争该锁,那么当前线程...原创 2022-04-10 11:41:27 · 412 阅读 · 0 评论 -
Java并发-锁的对比与升级-浅谈偏向锁
我先讲一下锁的概述吧为了减轻获得锁和释放锁的性能消耗,在JDK1.6时,引入了【偏向锁】和【轻量级锁】。所以锁一共有四种状态,级别从低到高:无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态。线程在竞争过程中锁会进行升级。而且锁一旦升级后无法降级,比如说,偏向锁升级为轻量级后是不能降级为偏向锁的。接下来介绍一下偏向锁。首先,为什么要引入偏向锁呢? 因为研究JVM的人发现,在大多数情况下,锁之...原创 2022-04-09 22:12:11 · 238 阅读 · 0 评论