Java并发
Thxxxxxx
然鹅我不想简介自己
展开
-
并发编程中的“冷知识”(更新中)
在解锁的时候,JVM需要强制刷新缓存,使得当前线程所修改的内存对其他线程可见 volatile强制所修饰的变量及它前边的变量刷新至内存,并且volatile禁止了指令的重排序。 多把锁保护一个资源,一把锁用于查看资源,一把锁用于修改资源。现在有俩个线程,一个修改资源,一个查看资源,修改资源的结果并不会对查看资源的线程具有可见性。 非公平锁和notify()方法可能产生“饥饿”问题。即有的线程...原创 2019-05-15 21:46:53 · 176 阅读 · 0 评论 -
LinkedBlockingQueue和ArrayBlockingQueue
ArrayBlockingQueue的初始化必须传入队列大小,LinkedBlockingQueue则可以不传入 ArrayBlockingQueue用一把锁控制并发,LinkedBlockingQueue俩把锁控制并发,锁的细粒度更细 ArrayBlockingQueue采用数组的方式存取,LinkedBlockingQueue用Node链表方式存取...原创 2019-08-19 21:21:51 · 126 阅读 · 0 评论 -
大话synchronize底层原理
在每个对象中mark word中LockWord指向monitor的起始地址,也就是每个对象与一个monitor相关联。在monitor中有个Owner字段记录着拥有锁的线程。初始时为NULL表示当前没有任何线程拥有该锁,当线程成功拥有该锁后保存线程唯一标识,当锁被释放时又设置为NULL。修改过程都是以CAS的方式修改。synchronize 就有了偏向锁,偏向锁的适用场景为 没有发生锁竞争的情...原创 2019-08-09 15:49:56 · 618 阅读 · 0 评论 -
一段CyclicBarrier代码
如图所示,这是需求,下面为代码实现// 订单队列Vector<P> pos;// 派送单队列Vector<D> dos;// 执行回调的线程池 Executor executor = Executors.newFixedThreadPool(1);final CyclicBarrier barrier = new CyclicBarrier(2...原创 2019-06-24 22:07:53 · 89 阅读 · 0 评论 -
线程池源码分析
为什么要用线程池? 降低系统资源消耗。 提高线程可控性。 如何创建使用线程池?JDK8提供了五种创建线程池的方法:1.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnnewThreadPool...转载 2019-04-23 10:52:22 · 102 阅读 · 0 评论 -
Java并发
Java并发系列(1)AbstractQueuedSynchronizer源码分析之概要分析 Java并发系列(2)AbstractQueuedSynchronizer源码分析之独占模式 Java并发系列(3)AbstractQueuedSynchronizer源码分析之共享模式 Java并发系列(4)AbstractQueuedSynchronizer源码...转载 2019-04-20 09:13:45 · 117 阅读 · 0 评论 -
Condition的await()方法
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); Node node = addConditionWaiter(); //释放同步状态(锁) int savedStat...转载 2019-06-03 10:26:13 · 4145 阅读 · 0 评论 -
公平锁的lock()方法走读
首先我们先搞明白继承关系,ReentrantLock的内部类FairSync extends Syncextends AbstractQueuedSynchronizer ReentrantLock中的内部类FairSync中lock方法,调用了AbstractQueuedSynchronizer中的acquire()方法。 final void lock() { ...原创 2019-06-19 21:59:51 · 450 阅读 · 0 评论 -
内存模型和锁
由于cpu处理速度和内存读取速度相差太远,同时cpu对内存的读取消耗要大于对缓冲的读取,所以为每个cpu加了自己的缓冲区域。从而导致了线程之间的可见性问题。在程序执行期间,会有虚拟机编译优化和处理器编译优化。从而导致了线程之间的有序性问题。java引入了内存模型,它描述了多线程代码中哪些行为是合法的。按照我们的要求禁用缓冲和编译优化。其中,votilate,final,synchron...原创 2019-06-19 16:38:35 · 170 阅读 · 0 评论 -
nonfairTryAcquire和tryAcquire
protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedP...原创 2019-05-22 15:55:30 · 1392 阅读 · 0 评论 -
Happens-Before的7个规则
(1).程序次序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。准确地说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。(2).管程锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个锁,而"后面"是指时间上的先后顺序。(3).volatile变量规则:对一个volatile变量的写操作先行发生于后面对...转载 2019-05-15 21:23:36 · 298 阅读 · 0 评论 -
线程的六种状态
NEW(初始):线程被创建后尚未启动。 RUNNABLE(运行):包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在运行,也可能正在等待系统资源,如等待CPU为它分配时间片。 BLOCKED(阻塞):线程阻塞于锁。 WAITING(等待):线程需要等待其他线程做出一些特定动作(通知或中断)。 TIME_WAITING(超时等待):该状态不同于WAITING...转载 2019-08-24 08:52:02 · 197 阅读 · 0 评论