![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java并发编程
文章平均质量分 77
介绍Java并发相关知识
程序员铁蛋
这个作者很懒,什么都没留下…
展开
-
Java并发工具之Future和Callable
1. Runnable的缺陷不能返回一个返回值;不能在方法声明异常;为什么设计成这样:即便是声明异常,也没有处理它的类,所以没必要这么设计;2. Callable接口类似于Runnable;实现call方法;有返回值;3. Future类作用:遇到耗时的方法,用子线程去执行,本身去执行其他的事情;Callable和Future的关系:可以用Future.get来获取C...原创 2020-03-18 10:33:48 · 157 阅读 · 0 评论 -
Java并发工具之AQS原理
1. 为什么需要AQS?AQS:AbstractQueuedSynchronizer,抽象队列同步器;锁和协作类的共同点:闸门;ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock都有类似的协作功能,因为都用了一个共同的基类:AQS;就ReentrantLock和Semaphore而言可以屏蔽很多细节,有许多共同的部分...原创 2020-03-17 19:24:17 · 104 阅读 · 0 评论 -
Java并发工具之控制并发流程的工具类
1. 什么是控制并发流程?控制并发流程的工具类:帮助我们程序员更容易的让线程之间协作;让线程之间配合,来满足业务逻辑;比如:让线程A等待线程B执行完毕后再执行等合作策略;2. 有哪些控制并发流程的工具类?类作用Semaphore信号量,可以通过控制“许可证”的数量来保证线程之间的配合,线程只有拿到“许可证”后才能继续运行。相比于其他的同步方法,更加灵活Cy...原创 2020-03-14 19:14:27 · 204 阅读 · 0 评论 -
Java并发工具之并发容器
1. 并发容器概览类简介ConcurrentHashMap线程安全的HashMapCopyOnWriteArrayList线程安全的ListBlockingQueue接口,表示阻塞队列,适用于作为数据共享的通道ConcurrentLinkedQueue线程安全的LinkedList,非阻塞队列2. Vector和Hashtable为什么过时?...原创 2020-03-13 18:04:56 · 178 阅读 · 0 评论 -
Java并发工具之final关键字
1. 什么是不变性?如果对象在创建后,状态就不能被修改,那么他就是不可变的;具有不变形的对象一定是线程安全的;2. final的作用类防止被继承、方法防止被重写、变量防止被修改;线程安全,不需要同步开销;3. final的用法被final修饰的变量:被final修饰的变量,意味着值不能被修改。如果变量是对象,那么对象的引用不能变,但是对象自身的内容依然可以变化;被fin...原创 2020-03-11 14:57:46 · 105 阅读 · 0 评论 -
Java并发工具之CAS原理
1. 什么是CAS?CompareAndSwap:比较并交换;CAS的判断思路:认为变量V的值应该是A,如果是的话就修改为B,如果不是A,就不修改,避免多线程同时修改出错;CAS的等价代码:public class CasDemo implements Runnable { private volatile int value; public synchronize...原创 2020-03-11 11:44:53 · 160 阅读 · 0 评论 -
Java并发工具之原子类
1. 什么是原子类?一个操作是不可分割的,即便是在多线程的情况下也可以保证;作用和锁类似,保证并发安全,但是原子类的粒度更细,锁是锁住好几行代码,原子类锁的是这个变量;通常情况了,原子类比锁效率更高,除了高度竞争的情况;原子类类型基本类型原子类AtomicInteger、AtomicLong、AtomicBoolean数组类型原子类AtomicIntege...原创 2020-03-11 10:47:34 · 105 阅读 · 0 评论 -
Java并发工具之锁分类
1. Lock简介、地位、作用锁是一种工具,用于控制对共享资源的访问;Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用上和功能上又有较大的不同;Lock并不是用来代替synchronized的,而是当使用synchronized不合适或者不满足要求的时候,来提供高级功能的;Lock接口中最常见的实现类是ReentrantLock;通常情况...原创 2020-03-10 14:34:47 · 221 阅读 · 0 评论 -
Java并发工具之ThreadLocal
1. ThreadLocal的两大使用场景每个线程需要一个独享的对象(通常是工具类),每个线程内有自己的实例副本,不共享;每个线程内需要保持全局变量,可以让不同的方法直接使用,避免传递参数的麻烦;总之,就是解决多个线程的共享变量的线程安全问题;2. 解决SimpleDateFormat的线程安全问题问题代码:public class MyThreadLocal { p...原创 2020-03-08 18:46:47 · 137 阅读 · 0 评论 -
Java并发工具之线程池
1. 什么是线程池?线程的创建和销毁是有一定的开销的,为了减少开销(内存和垃圾回收),我们通过创建线程池来执行大量的任务,避免反复创建并销毁线程所带来的问题,如果不用线程池,一旦任务数量过多,新建线程过多可能会OOM异常,即内存溢出。好处:限制线程资源的总量,复用每一个线程,同一管理资源加快响应速度,合理利用CPU和内存适用场景:服务器接收大量请求(Tomcat本身就是用线程...原创 2020-03-08 14:24:14 · 292 阅读 · 0 评论 -
Java并发编程之死锁
1. 什么是死锁?当两个线程互相持有对方所需要的资源,又不主动释放,导致所有线程都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁,如果多个线程之间的依赖关系是环形,也可以形成死锁;死锁发生在并发中,单线程是不会发生死锁的;死锁的影响:在不同系统中是不一样的,这取决于系统对死锁的处理能力数据库中:检测并放弃事务可以修复死锁JVM中:无法自动处理必然发生死锁的例子:p...原创 2020-03-07 16:50:48 · 90 阅读 · 0 评论 -
Java并发编程之常见面试题(二)
21.synchronized使用有哪些注意点?锁对象不能为空,因为锁是保存在对象头中,对象都没有,就没有对象头作用域不能过大,把所有代码都被修饰,就是串行了,会影响到程序执行的速度避免死锁,两个锁,两个线程,线程一持有锁一请求锁二,线程二持有锁二请求锁一22.如何选择Lock和synchronized关键字?如何可以的话,不使用这两个,尽量使用JUC包中的类优先使用synchr...原创 2020-03-06 10:53:40 · 97 阅读 · 0 评论 -
Java并发编程之synchronized关键字
1. synchronized基本用法定义:如果一个对象对多个线程可见,synchronized能够保证在同一时刻最多只有一个线程操作这个对象,以达到保证并发安全的效果。作用:保证可见性和原子性,可以避免线程安全问题:运行结果错误两种使用方法:对象锁:方法锁,默认锁对象为this当前实例对象public class ObjectLock3 implements Runnabl...原创 2020-03-05 17:51:11 · 123 阅读 · 0 评论 -
Java并发编程之Java内存模型
1. 底层原理1.1 JVM内存结构 VS JMM内存模型JVM内存结构和JVM的运行区域有关,包括堆、方法区、虚拟机栈、本地方法栈、程序计数器堆:线程共享,new出来的实例对象;虚拟机栈:线程私有,基本数据类型以及对象的引用地址;方法区:线程共享,static静态变量,类信息(方法代码,变量名,方法名,访问权限,返回值),常量,永久引用(static修饰的类);本地方法栈:nat...原创 2020-03-05 17:51:04 · 120 阅读 · 0 评论 -
Java并发编程之多线程会导致的问题
1. 线程安全问题1.1 什么是线程安全?某权威作者定义:“当多个线程访问同一个对象时,如果不用考虑这些线程的调度,也不需要额外的同步,调用这个对象的行为都可以获得正确的结果,那么这个对象时线程安全的“。通俗易懂的定义:当多个线程访问同一个对象时,不需要做额外的任何处理,像单线程编程一样,程序可以正常运行,就可以称为线程安全。1.2 线程安全问题有哪些?运行结果错误:a++多线程下...原创 2020-03-03 16:36:19 · 1134 阅读 · 0 评论 -
Java并发编程之线程异常
多线程异常第一种处理方式:局部处理在多线程编程中,如果主线程出现异常,我们可以使用try/catch等方式轻松的处理异常;如果子线程出现异常,则需要在每个子线程中可能发生异常的地方用try/catch进行处理,代码如下:public class CommonThread implements Runnable { @Override public void run() {...原创 2020-03-03 14:47:00 · 154 阅读 · 0 评论 -
Java并发编程之线程属性和方法
1. 线程方法1.1 方法概览类.方法简介Thread.sleep()线程休眠,不释放锁Thread.join()等待其它线程执行完毕Thread.yield()放弃已经获取到的CPU资源Thread.currentThread()获取当前线程的引用Thread.start()/Thread.run()启动线程和线程执行内容Threa...原创 2020-03-02 17:03:40 · 144 阅读 · 0 评论 -
Java并发编程之线程生命周期
1. 线程生命周期:六种状态如下图所示:NEW:创建线程之后还没有执行start方法,此时线程处于NEW状态RUNNABLE:执行start方法之后,处于RUNNABLE状态,是可运行状态。对应着操作系统READY(为获取到CPU)和RUNNING(获取到CPU)两种状态,这两种状态在这里都是可运行状态。BLOCKED:1. 当前线程等待另外一个线程释放monitor锁,以期待进入到...原创 2020-02-29 20:49:31 · 87 阅读 · 0 评论 -
Java并发编程之停止线程
1. 线程在什么情况下会停止?在三种情况下会导致线程停止:run方法正常执行完毕执行过程中出现异常其它线程干预当前线程,如interrupt、volatile修饰的标识符、已经被弃用的stop、suspend等方法2. 停止线程的正确方法:interrupt使用interrupt来通知需要被停止的线程以及该线程如何配合,而不是强制停止,因为被停止的线程对本身的业务逻辑是最熟悉的,而...原创 2020-02-29 18:54:00 · 221 阅读 · 0 评论 -
Java并发编程之创建和启动线程
实现线程的正确方法:2种实现Runnable接口创建线程/** * 实现Runnable接口创建线程 */public class MyThread implements Runnable { @Override public void run() { System.out.println("实现Runnable接口创建线程"); } ...原创 2020-02-28 15:50:44 · 111 阅读 · 0 评论 -
Java并发编程之常见面试题(一)
1. 进程和线程的异同?相同点:生命周期相似,都包含就绪、运行、终止等状态不同点:1. 起源不同,先有进程,由于CPU的提升以及性能要求的提高,才有了线程;2. 内存共享机制不同:进程与进程之间通常不能共享数据,线程与线程之间不需要任何处理就能直接共享数据;3. 拥有资源数量不同,线程共享的属性:进程ID、进程公有数据等;线程私有的属性:线程ID、线程堆栈,进程是线程的容器,一个进程至少...原创 2020-02-28 11:07:02 · 172 阅读 · 0 评论 -
Java并发编程之同步与异步、阻塞与非阻塞
同步与异步被调用者是否主动告诉调用者结果,针对被调用者而言左图是同步的情况:客户端向服务器请求数据,在服务器准备数据期间,客户端需要不停的等待,无法做别的事右图是异步的情况:客户端向服务器请求数据,在服务器准备数据期间,客户端可以做其他的事情,直到服务器返回这个结果阻塞与非阻塞调用者在调用结果返回前,是否还能做别的事,针对调用者而言线程状态角度:是线程六中状态的其中三种(Blo...原创 2020-02-28 10:44:23 · 319 阅读 · 0 评论 -
Java并发编程之并发与并行
什么是并发?并发的概念:两个或多个任务在重叠的时间段内运行和完成。并发的特点:只利用一个处理器,只是因为处理器处理速度很快,所以看起来像同时运行,但这只是逻辑上的同时运行,在物理层面还是串行。什么是并行?并行的概念:两个或多个任务在同一时刻开始运行和完成。并行的特点:利用多个处理器同时进行处理,是物理上的同时运行。比如说,在多核处理器上,有两个线程同时执行同一段代码,而单核处理器无法执...原创 2020-02-28 10:11:02 · 364 阅读 · 0 评论 -
Java并发编程之进程与线程
我们来看一下操作系统、进程、线程的包含关系:操作系统是包含多个进程的容器,而每个进程是包含多个线程的容器什么是进程?代码角度:把一个类new出来是一个实例化的过程,进程就是对代码的一种实例化;总结:进程是程序(理解为我们写的代码)的真正运行实例,是系统资源(内存、CPU等)分配和调度的基本单位;什么是线程?线程是CPU的基本调度单位,每个线程执行的都是进程代码的的某个片段;...原创 2020-02-27 19:09:59 · 83 阅读 · 0 评论