多线程
文章平均质量分 63
不会汪汪的猫咪
可以称得上是做互联网金融的开发工程师,会点Java,会点Python
展开
-
ConcurrentHashMap源码学习
ConcurrentHashMap源码学习自从学习了AQS之后,想着重新读一下ConcurrentHashMap的源码来加深下理解,所以有了这篇文章,针对ConcurrentHashMap常用的方法进行分析。0,基础知识以及一些字段的含义1.8中的ConcurrentHashMap使用了比较多的CAS操作,例如设置每个tab。设置一些变量值,用UnSafe类来操作。这三个字段值表示了特殊的...原创 2018-12-11 22:35:25 · 201 阅读 · 0 评论 -
AQS理解之七——AQS中的条件队列
AQS中的条件队列在AQS中还实现了一个类,ConditionObject,它实现了Condition接口,实现一个绑定在锁上的条件队列。先看看他的uml图。主要方法它实现了Condition接口,主要实现的方法是await和signal以及它们的带时间参数方法。条件队列的一般用法:当满足某个条件时,通知正在等待这个条件的线程(signal)当需要满足某个条件才能继续执行时,进行阻...原创 2018-12-10 16:58:42 · 2578 阅读 · 0 评论 -
AQS理解之六,AQS的其他实现类
AQS理解之六,AQS的其他实现类1,ThreadPoolExecutor 中的 Worker 类protected boolean tryAcquire(int unused) { if (compareAndSetState(0, 1)) { setExclusiveOwnerThread(Thread.currentThread()); ...原创 2018-12-10 13:44:05 · 1031 阅读 · 0 评论 -
AQS理解之五—并发编程中AQS的理解
AQS理解之五—并发编程中AQS的理解首先看下uml类图:AbstractOwnableSynchronizer 这个类定义是提供一个创建锁的基础,设置一个排它线程,帮助控制和监控访问。先看下AbstractQueuedSynchronizer 这个类的内部变量。Head和tail是两个Node变量。int型的state。long型的spinForTimeoutThreshold...原创 2018-12-09 11:45:09 · 565 阅读 · 0 评论 -
AQS理解之四—看看我们写的和 ReentrantLock 的公平不公平锁的区别
AQS理解之四,看看我们写的和 ReentrantLock 的公平不公平锁的区别首先看下ReentrantLock的lock和unlock方法。不公平锁版本lock方法final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThrea...原创 2018-12-09 11:34:32 · 630 阅读 · 0 评论 -
AQS理解之三,由刚才写的锁转变成一个公平锁
AQS理解之三,由刚才写的锁转变成一个公平锁在第二节里我们实现了一个不公平的锁,之所以说它不公平,主要是因为加锁后解锁时,阻塞的其他线程获取到的锁的可能是随机的,并不是按照顺序来确定的,如果要转变为公平锁,我们应该要记录这个进入的顺序,并在解锁时必须满足是第一个阻塞等待的线程才解锁。其次,在上一节我们实现的锁是一个自旋阻塞等待的,这样的话线程还是在继续白白工作的,我们在这里也进行优化,使用Lo...原创 2018-12-09 10:37:02 · 211 阅读 · 0 评论 -
Java中 synchronized 关键字的理解
synchronized 关键字的理解在Java中,synchronized 是一个重量级的控制并发的关键字。这个关键字可以保证并发过程所必须的“原子性”,“可见性”,“有序性”一,用法:在方法内加锁:synchronized 块在代码编译后生成的字节码中实际上是加上monitorenter 和monitorexit。//对当前的this对象加锁,和synchronized成员方法是一...原创 2018-12-13 21:49:31 · 289 阅读 · 0 评论 -
AQS理解之二,自己设计一个锁
AQS理解之二,自己设计一个锁一,实现锁的条件首先我们想一想,如果我们自己实现一个类似于java中的锁,我们可能需要哪些必要的东西:1,记录是哪个线程持有了锁。2,如果有一个变量代表加锁,A线程加锁,需要让B线程能看见,这里需要可见性,所以我们可能要用到volatile变量。3,对变量的操作应该是一个原子操作。二,实现首先我们定义一个类,这个类需要有一个持有锁的变量。这里使用owne...原创 2018-12-08 23:33:41 · 296 阅读 · 0 评论 -
AQS理解之一,基础知识——LockSupport
AQS理解之一,基础知识——LockSupportLockSupport类位于java.util.concurrent包下。顾名思义,就是一个实现锁的辅助类。来看下他的类结构:其中的变量都是通过UNSAFE类来赋值,代码如下:private static final sun.misc.Unsafe UNSAFE; private static final long parkBl...原创 2018-12-08 21:55:11 · 803 阅读 · 0 评论 -
深入浅出理解锁之—— AbstractQueuedSynchronizer
并发编程中AQS的深入理解前一段时间学习了AQS的代码,对java中的锁有了新的理解,用这篇博客来记录下。大概分为以下几个部分。一,基础知识——LockSupport二,自己设计一个锁三,由刚才写的锁转变成一个公平锁四,看看我们写的和ReentrantLock的公平不公平锁的区别五,看看AQS的代码实现六,AQS的其他实现类...原创 2018-12-08 21:24:24 · 436 阅读 · 0 评论 -
Java内存模型与happens-before原则
Java内存模型Java内存模型不同于Jvm内存模型,Java内存模型(JMM)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将于其他线程可见。一,平台的内存模型二,重排序再没有充分同步的程序中,如果调度器采用不恰当的方式来交替执行不同线程的操作,那么将导致不正确的结果。更糟糕的是,JMM还使得不同线程看到的操作执行顺序是不同的,从而导致在缺乏同步的情况下,要推...原创 2018-12-05 16:11:48 · 266 阅读 · 0 评论 -
线程池工作原理
线程池工作原理线程池状态的切换:线程池关键类的uml图:线程池就是把任务提交和任务执行解耦。首先看一下线程池的使用:public static void main(String args[]) throws InterruptedException { ExecutorService es = Executors.newFixedThreadPool(10);//1,创建线程池...原创 2018-11-29 11:54:21 · 313 阅读 · 0 评论 -
看了这一篇,就不用看别的——Java中Object关于锁的的三个方法:wait,notify,notifyAll的作用
Object关于锁的的三个方法:1 wait 让当前持有对象的线程等待,锁释放(所以必要条件是当前线程必须持有这个对象的锁(sychronized 或者可重入锁 ReentrantLock ),否则调用wait会报错 java.lang.IllegalMonitorStateException)。其他线程可以去竞争获取这个对象锁。2 notify notify 通知其中一...原创 2018-07-30 21:14:27 · 1116 阅读 · 0 评论 -
Java线程 Thread 的6种状态以及转变过程
线程的6种状态以及转变:java的线程一共6种状态。具体代码见: java.lang.Thread.State1 NEW 新建状态 Thread state for a thread which has not yet started. 线程还没有调用start的时候2 RUNNABLE 可运行状态 Thread state ...原创 2018-07-30 17:48:43 · 7346 阅读 · 0 评论 -
ThreadLocal 变量和 与线程池配合使用时可能会出现的问题
ThreadLocal 变量和 与线程池配合使用时可能会出现的问题ThreadLocal 的介绍和使用先看下ThreadLocal变量的使用 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map...原创 2019-01-16 11:46:18 · 1374 阅读 · 0 评论