![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JAVA-并发编程
文章平均质量分 80
系统学习笔记记录
ma937958191
这个作者很懒,什么都没留下…
展开
-
12.并发编程-JMM底层实现原理(杂)
并发编程领域的关键问题JVM对java内存模型的实现在java虚拟机中,所有对象的实列都是在推中,对象引用都在栈中,并且堆是线程共享区,栈是线程私有区。虽然说堆式线程共享区,但是前提是线程能够拿到这个对象的引用地址才行。java调用方法时候,首先将方法打包成栈帧,加入到栈中。...原创 2022-04-17 15:27:34 · 249 阅读 · 0 评论 -
10.并发编程-线程安全
类的线程安全定义如果多线程下使用这个类,不管多线程如何调度这个类,这个类总是表现出正确的行为,那么这个类就是线程安全的。一般类的线程安全包括:操作的原子性、内存共享栈封闭所有的变量都是在方法内部中声明的,那么这些变量都属于栈封闭状态,是属于线程安全的。无状态没有任何成员变量的类,就叫无状态类。让类不可变让状态不可变。所有基本类型的包装类都是不可变类。对于一个类来说,所有的成员变量是私有的,同样的只要有可能,所有变量都应该加上final关键字。...原创 2022-04-09 14:16:06 · 154 阅读 · 0 评论 -
9.并发编程-线程池
线程池什么线程池?为什么使用线程池1.降低线程创建和销毁的资源消耗2.提高响应的速度一个线程整个生命周期分三个时间段:T1创建时间,T2执行时间,T3销毁时间。如果使用一般模式创建线程,那么消耗是T1+T2+T3时间总和,如果采用线程池可以避免T1和T3这时间。3.提高线程的管理性实现一个线程池1.线程必须在线程池中已经创建好了,并且可以保持性,要有容器可以保存多个线程2.线程还能接受外部的任务,运行这个任务package ms.studyjava.threads.demo9;原创 2022-04-05 17:20:57 · 256 阅读 · 0 评论 -
8.并发编程-并发容器
ConcurrentHashMap原创 2022-04-04 15:39:46 · 817 阅读 · 0 评论 -
7.并发编程-锁的探究
可重入锁synchronizedReentrantLock可重入锁存在是为了解决死锁的问题。可重入锁的实现原理就是基于aqs里面的state计数状态来实现的。如果一个线程已经拿到锁,并且再次调用加锁的方法时候,会首先使用tryAcquire方法判断拿到锁的线程是否是当前线程,不是的话抛出异常,是的话原来的state+1。当线程用完锁释放时候,在释放锁方法tryRelease里面,会对state-1,直到state=0时候,下个线程才会来取锁。跟踪源码state变化首先新建一个类,写上下面方法,原创 2022-04-02 09:16:15 · 228 阅读 · 0 评论 -
7.并发编程---AQS介绍和源码剖析
什么是AQSAQS全称为AbstractQueuedSynchronizer。其中的设计模板采用了,继承和模板方法设计模式。其中常用的模板方法独占式获取锁1.accquire2.acquireInterruptibly3.tryAcquireNanos共享式获取锁1.acquireShared2.acquireSharedInterruptibly3.tryAcquireSharedNanos独占式的释放锁1.release共享式释放锁1.releaseShared需要原创 2022-03-30 20:42:32 · 529 阅读 · 0 评论 -
6.并发编程---显示锁简单介绍
Lock与Synchronized场景区别Lock:获取锁可以被中断,超时获取锁,尝试获取锁,读多写少的时候优先使用lock,其他情况推荐使用SynchronizedLock加锁代码public class LockDemo { //ReentrantLock实现Lock接口.默认无参构造是非公平锁。 Lock lock = new ReentrantLock(true); Integer count = 0; public void incre1() { .原创 2022-03-26 16:26:02 · 324 阅读 · 0 评论 -
5.并发编程---CAS
CAS原理利用了现代的处理器都支持的CAS的指令,然后循环这个指令,直到成功为止。CAS(Compare And Swap)指令级别保证了原子操作。三个运算符号:V内存地址,A期望值,B新的值原理实现:通过自旋方式(死循环)不断的进行CAS操作。如果地址V上的值等于期望值A,内存地址V就把值赋值给新值B。如果不等于的话,不做任何操作CAS问题ABA问题与解决问题:比如内存地址有一个值V,这时候线程A对V进行-1,然后线程B对V进行+1。虽然线V值和以前一样,但是实际上它已经变化了两次,V-&g原创 2022-03-26 14:00:13 · 410 阅读 · 0 评论 -
4.并发编程---并发工具类关键方法
CountDownlatch作用:使一个线程等待其他线程执行完成后,才可继续执行,加强版的JOIN。不同于join的是,CountDaownLatch有两个方法,一个是await()用来等待,一个是countDown()用来计数,当countDown计数为0的时候,才会继续执行下面的线程。举个列子:在Main方法中,如果我想在main函数运行前,先去初始化两个方法(必须这两个方法执行完成),然后在继续执行main下面的业务。先看上图:整体是个Main线程。中间横线分割线(相当于围栏),上面是初始化原创 2022-03-21 19:49:08 · 254 阅读 · 0 评论 -
3.并发编程---并发工具类Fork-Join
Fork-join概念图分而治之:将一个大的任务分成N个小任务同时进行执行,等待所有的小任务执行完成后,进行结果汇总。工作密取:因为多个小任务执行完成的时间不一样,比如A线程先完成计算的小任务的结果,将结果放到一个指定的队列中,A线程就不需要继续等待其他线程执行完成,A可以继续干其他事情了。Fork-join使用标准范式根据上面的用法,对比下单线程与使用fork多线程同步用法计算的结果消耗时间/** 产生整形数组的工具类** */public class MakeArrays {原创 2022-03-20 14:35:59 · 320 阅读 · 0 评论 -
2.并发编程---常用的关键字
常用的synchronized锁对象锁和类锁的区别‘对象锁:一般直接用synchronized修饰某个方法即可类锁:一般是修饰static的方法,相当于是修饰整个类,所以称类锁总结:如果是同一个对象调用对象锁的方法时候,他们会按照顺序去执行方法,如果是不同的对象调用对象锁的方法,他们会异步去执行方法。如果是类锁,不管你是否是同一个对象,只要是方法属于类锁,他们都会按照顺序去执行方法。代码演示类锁和对象锁以后通用的线程睡眠工具类public class SleepTools { //按原创 2022-03-16 21:40:02 · 205 阅读 · 0 评论 -
1.并发编程---线程基础的概念
什么是线程与进程进程:类似于电脑打开的QQ、酷我音乐、腾讯影视等软件线程:在看电视的时候听歌并且聊天都属于线程完成的并发与并行并发:单位时间内可以执行的请求次数并行:在某一时刻可以执行的请求次数多线程实现的三种方式继承Thread类,重写run方法实现Runable接口,重写run方法实现Callable接口,重写call方法package ms.studyjava.threads.demo1;import lombok.SneakyThrows;import java.ut原创 2022-03-09 18:32:03 · 210 阅读 · 0 评论