![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
黙谷
这个作者很懒,什么都没留下…
展开
-
多线程设计模式之生产者/消费者
要点: 不需要产生结果和消费结果的线程一一对应 消费队列可以用来平衡生产和消费的线程资源 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据 JDK中各种阻塞队列,采用的就是这种模式 //消息类 public class Message { private int id; private Object massage; public Message(int id, Object mas原创 2022-03-27 10:38:01 · 74 阅读 · 0 评论 -
多线程设计模式之保护性暂停
保护性暂停即Guarded Suspension,用在一个线程等待另一个线程的执行结果。 要点: 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject JDK中,join的实现,Future的实现,采用的就是此模式 因为要等待另一方的结果,因此归类到同步模式 1.带超时版GuardedObject public class GuardedObject { private Object response; private final Object .原创 2022-03-27 10:23:51 · 95 阅读 · 0 评论 -
Java并发编程wait¬ify
一、原理 Monitor中的Owner线程发现条件不满足,调用wait方法,即可进入WaitSet变为WAITING状态。 BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片。 BLOCKED线程会在Owner线程释放锁时唤醒。 WAITING线程会在Owner线程调用notify或notifyAll时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入EntryList重新竞争。 二、API obj.wait():让进入object监视器的线程到waitset等待。 obj.not原创 2022-03-26 23:08:32 · 285 阅读 · 0 评论 -
对ConcurrentHashMap的理解
ConcurrentHashMap比HashMap并发好,比HashTable效率高,因为HashTable在对数据操作的时候都会上锁。 ConcurrentHashMap 在 JDK1.7 和 JDK1.8 的实现方式是不同的。 JDK1.7 JDK1.7 中的 ConcurrentHashMap 是segment+数组+链表的结构,即 ConcurrentHashMap 把哈希桶数组切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。 原理上来说,Concurren原创 2022-03-05 16:36:44 · 536 阅读 · 0 评论 -
Java中的悲观锁与乐观锁
悲观锁的代表是synchronized和Lock锁 1. 其核心思想是【线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程,都得停下来等待】。 2. 线程从运行到阻塞,再从阻塞到唤醒,涉及线程上下文切换,如果频繁发生,会影响性能。 3. 实际上,线程在获取synchronized和Lock锁时,如果锁已被占用,都会做自适应自旋(一个忙循环),减少阻塞机会。 乐观锁的代表是原子类,使用CAS来保证原子性 1. 其核心思想是【无需加锁,每次只有一个线程能成功修改共.原创 2022-03-05 15:34:14 · 239 阅读 · 0 评论 -
Lock与synchronized
语法层面 1. synchronized是关键字,源码在jvm中,用C++开发。 2. Lock是接口,源码由jdk提供, 用java语言实现。 3. 使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法释放。 功能层面 1. 二者均属于悲观锁,都具备基本的互斥同步,锁重入功能。 2. Lock提供了许多synchronized不具备的功能,例如:获取等待信息,公平锁,可打断,可超时,多条件变量等。 3. Lock有适合不同场景的实.原创 2022-03-05 15:19:46 · 192 阅读 · 0 评论 -
sleep与wait的区别
共同点 wait(),wait(long n)和sleep(long n)的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。 方法归属不同 1. sleep(long n)是Thread的静态方法。 2. wait(),wait(long n)都是Object的成员方法,每个对象都由。 醒来时机不同 1. 执行sleep(long n)和wait(long n)的线程都会在等待相应毫秒后醒来。 2. wait(long n)和wait()还可以被notify()或noti..原创 2022-03-05 15:04:51 · 219 阅读 · 0 评论