Java并发编程
关于并发编程
Crowno17
不想当码农
展开
-
一文详解ThreadLocal 使用场景,源码分析,内存泄漏分析
ThreadLocal使用场景:场景1. ThreadLocal用作保存每个线程独享的对象,为每个线程都创建一个副本,修改时只是对自己副本的操作,确保线程安全。典型的需要使用的类就是 SimpleDateFormat。场景2.ThreadLocal每个线程需要独立保存信息,以便提供其他方法更方便的获取。避免了参数的传递,类似与全局变量的概念。Thread、ThreadLocal、Threa...原创 2020-04-13 15:06:20 · 223 阅读 · 0 评论 -
源码分析----线程池的定制跟线程复用原理(长文慎入)
使用线程池的原因:避免频繁的创建线程、销毁线程导致系统资源的浪费使得工作单元\任务单元 与执行机制分离开解耦过多的线程会占用过多的内存等资源,还会带来过多的上下文切换public class ThreadPool { /** * * corePoolSize 核心线程数 * * maxnumPoolSize 最大线程数 *...原创 2020-01-11 12:32:06 · 247 阅读 · 0 评论 -
LockSupport 详解
LockSupportLockSupport 与每个使用它的线程都存在一个许可证,Map(Thread,permit) 因为是Unsafe 的 我猜数据结构大概如此。park()调用了park 方法的线程会检查当前线程是否有一个许可,有就直接返回,没有就将阻塞当前线程,直到获取到许可。unpark()会给当前线程一个LockSupport的许可,每个线程LockSupport只维护一个许...原创 2020-01-06 16:29:12 · 393 阅读 · 0 评论 -
源码分析----Semaphore
Semaphore 信号量计数信号量, 从概念上说,信号量维持了一些许可。每次achqire方法执行的时候,将会阻塞,一直到许可可用,然后获取许可才能去执行后面的方法。当release 方法执行的时候都会往初始化的容器中返还许可。潜在地,一个acquire 方法的阻塞将会解除阻塞然而并不是真正的Permit对象被使用掉了,它只是维护了一个可用的计数器。信号量经常被用来限制几个线程可以访...原创 2019-12-31 10:41:16 · 184 阅读 · 0 评论 -
源码分析----Lock锁
总结先写前面: 后面留给你去验证在AQS当中:主要有五个值得关注的点:private volatile int state; 锁状态的标志位0 为没有上锁。大于0 表示 加锁 值标识锁重入的次数。cas原子操作 保证了交换锁标志位的值,以及入队列等操作在高并发条件下不会出错。LockSupport 提供了将线程阻塞跟唤醒的操作,避免了无谓的自旋操作。队列 存储所有阻塞的等待唤醒的线程...原创 2019-12-26 20:05:06 · 291 阅读 · 0 评论 -
synchronized实现原理分析 - 字节码层面分析jvm底层如何实现Synchronized
开头我们先来复习一下synchronized的使用方法。第一种在实例方法上使用表示是对当前实例的加锁:public synchronized void myMethod2(){ System.out.println("hello world"); }第二种是用在类方法上表示对当前类的Class对象加锁: public static synchron...原创 2019-08-22 13:55:59 · 587 阅读 · 0 评论 -
CyclicBarrier,CountDownLatch 的使用以及实现原理
CyclicBarrier 可以使多个线程达到同一状态package com.sqh.TestLimiter;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.concurrent.CyclicBarrier;public class TestLimiter...原创 2019-08-21 19:09:15 · 334 阅读 · 0 评论 -
Java之死锁两种方式模拟
锁顺序死锁package ReadWirteLock;public class TestDeadLock { private final Object left = new Object(); private final Object right = new Object(); public void leftRight() { synchronized (lef...转载 2019-01-25 18:02:04 · 202 阅读 · 0 评论 -
Java读写锁
ReentrantLockReentrantLock它实现了标准的互斥锁,即当一个线程获取了锁,其他的线程都要等待,当前线程释放锁才能获得所有权。一次最多只有一个线程持有锁。通常作为保护数据一致性很强的的加锁约束,这样也就限制了程序的并发效率。虽然避免了 写---写,读---写 的线程安全问题,但是也同样避开了读读的的重叠。在很多的时候数据是被频繁读取的。ReentrantReadWr...转载 2019-01-25 14:12:36 · 2710 阅读 · 0 评论 -
重入锁-------synchronized
重入 :一般地,当一个线程请求由其他线程所持有的锁的资源时,发出请求的线程就会阻塞。然而,内置锁是可以重入的。因此当一个线程获得由该线程已经持有的锁,那么这个线程的请求就会成功。重入意味着获取锁的的粒度是线程。 第一种synchronized关键字public class Demo_001 implements Runnable { @Override pu...原创 2019-01-23 22:11:52 · 243 阅读 · 0 评论 -
Java并发编程之FutureTask
先来看一下简单的程序public class ConcurrencyTaskFuture { public static void main(String[] args) throws Exception { FutureTask<String> futureTask = new FutureTask<>(()->{ ...原创 2019-08-17 10:33:41 · 154 阅读 · 0 评论