Java并发编程
Java并发编程
小阳同学^_^
是行动让潜能无限
展开
-
16、Condition和Synchronized的区别
###区别Codition必须拿到锁Lock lock=new ReentactLock();Codition cod1=lock.newCodition();Codition cod2=lock.newCodition();Lock 和Synchronized 都是加1把锁,但是codition是条件锁,可以设置多个条件codition 内部实现了1个等待队列。等待的条件,就排在等待...原创 2020-03-18 21:01:02 · 558 阅读 · 1 评论 -
15、ForkJoin
###是什么Fork/JOIN 框架是分解计算任务,然后再合并计算任务。例如;1+2+3+4为了提交效率,将1+2划到1个任务队列里,2+3划到第二个任务队列里###应用不需要继承ForkJoinTask 类,只需要继承其子类 RecursiveTask即可###实现原理1、维护了1个任务队列,和ForkJoinPool2、任务队列是双端队列,线程从头部开始获取任务3、工作窃取算...原创 2020-03-15 05:22:22 · 82 阅读 · 0 评论 -
14、单例(双重锁和内部类)
###单例模式单例模式是在一个应用中,该类只有1个实例1、需要将构造方法私有化。2、获取实例的方法static3、有饿汉和懒汉模式。饿汉模式是线程安全的。会影响启动速度懒汉模式会在用的时候,再去创建。但是是线程不安全的,双重锁和内部类可以使懒加载是线程安全的###双重锁/**懒汉模式细粒度(线程安全的)*/public class SingletonLazySa...原创 2020-03-15 05:06:10 · 137 阅读 · 0 评论 -
13、Executor
###Executor有几大部分组成1、任务:任务的执行需要实现Runable 接口或Callable接口2、任务的执行:Executor的子类 ExcutorService更强大。有两个关键类实现了接口:ThreadPoolExecutor 和ScheduledThreadPoolExecutor;3、异步计算的结果:包括接口Future 和实现Future接口的FutureTask(实...原创 2020-03-14 21:16:57 · 146 阅读 · 0 评论 -
12、Semaphore
###Semaphore是什么?信号灯。同时只能让设定的N个线程同时执行,其他的等待。###实现原理acquire() 表示阻塞并获取许可release() 表示释放许可Semaphore内部有1个许可证列表。acquire调用1次就会拿到1个许可,许可会-1(CAS)。设置的入参就是一共有几个许可。如果许可为0,则获取不到许可,线程阻塞。release()释放许可后,许可会+1(C...原创 2020-03-13 16:09:56 · 68 阅读 · 0 评论 -
11、CyclicBarrier
###CyclicBarrier是什么同步屏障设置N个线程,等到所有的线程都await后,达到屏障,然后大家一起再往下执行。###实例public class CyclicBarrierTest {public static void main(String[] args) { final CyclicBarrier cyclicBarrier=new CyclicBarrier...原创 2020-03-13 16:02:25 · 64 阅读 · 0 评论 -
10、CountDownLatch
???原创 2020-03-12 18:17:54 · 71 阅读 · 0 评论 -
9、JUC(java.util.current)
###ConcurrentHashMapHashMap :数组+链表ConcurrentHashMap:segment数组+链表1、segment数组加上了可重入锁。(ConcurrentHashMap中的每个segment都加了锁)2、会把key 散列2次 key–hash–hash因为1次的散列效果非常差。散列的hash值后面的数字大部分都一样。会造成Hash碰撞(也叫hash冲突...原创 2020-03-11 23:25:15 · 169 阅读 · 0 评论 -
8、等待/通知模式
###等待/通知模式分为2种1、Java基类中的wait,notify,notifyAll2、Condition接口的await(),signal();原创 2020-03-10 23:48:50 · 185 阅读 · 0 评论 -
7、LockSupport
。。。原创 2020-03-10 23:46:54 · 59 阅读 · 0 评论 -
6、LOCK
###LOCK接口以及实现Lock是个接口,具体讲lock的2个实现类1、ReentrantLock2、ReentrantReadWriteLocl###队列同步器:AbstractQueueSynchronizer (AQS)队列为FIFO 链式阻塞队列出列:CAS自旋。上一个node节点的next -->下一个节点的prev(前驱节点)入列:CAS自旋。未获取到锁的线程,...原创 2020-03-10 23:46:03 · 92 阅读 · 0 评论 -
5、TreadLocal
###ThreadLocal是什么###TreadLocal调用案例###为什么TreadLocal会出现内存泄漏###怎么防止TreadLocal的内存泄漏原创 2020-03-10 23:20:37 · 102 阅读 · 0 评论 -
4、线程(并发编程)
###什么是线程线程是操作系统调度的最小单元一个Java程序从main()方法开始执行。那么启动一个main()线程,一个Java程序,为什么后台会有多个线程。线程分为用户线程和守护(deamon)线程当用户线程数为0,Java 虚拟机会停止。###线程优先级线程的优先级范围 1~10优先级越高的线程会获取到更多的CPU时间片系统默认的线程优先级是5设置线程优先级的方法:set...原创 2020-03-10 23:14:39 · 165 阅读 · 0 评论 -
3、synchronized
###实现原理synchronized是通过指令monitorentor 和monitorexit指令实现的由上图可以看出,线程想要访问对象,是需要监视器(Monitor)配合同步队列(SynchronizedQueue)给对象加锁的。SynchronizedQueue 同步队列是一个双向链表 FIFO ,也是由CAS原理实现的为什么使用链表 而不使用数组? 是因为双向链表 可以在新增和...原创 2020-03-10 19:32:28 · 150 阅读 · 0 评论 -
2、volatile关键字(并发编程)
###CPU术语1、内存屏障:是一组处理器指令。在程序中添加volatille关键字,JVM解释成汇编指令的时候,会在该变量前加上lock指令。lock指令会在该段内存中,加上内存屏障,防止CPU的重排序。2、缓冲行:CPU执行非常快,操作主内存的时候,主内存根本扛不住。所以会在CPU和主内存之间加了一个缓冲区。CPU将数据写入缓冲行L1,L2,L3,但不是马上写入主内存中。异步操作。3、原...原创 2020-03-10 01:23:48 · 137 阅读 · 0 评论 -
1、并发编程的挑战
###多线程一定快吗即使是单核CPU,也支持多线程执行代码。CPU通过给每个线程分CPU时间片,来实现多线程。##上下文切换CPU在执行多线程代码的时候,会在切换前,保存上一个线程的状态,以便切换回来时,继续执行。这种保存再加载的过程,就是一次上下文切换任务少,当上下文切换频繁的时候,多线程并不一定必单线程效率高##如何减少上下文切换1、无并发编程:多线程竞争锁的时候,会引起上下文...原创 2020-03-10 00:38:54 · 93 阅读 · 0 评论 -
0、JMM
#JMM原创 2020-03-08 23:35:47 · 208 阅读 · 0 评论