![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java并发编程
文章平均质量分 88
介绍java并发编程的各种知识点
questions?
Hold on
展开
-
并发编程之线程池
文章目录线程使用上的问题线程的复用线程池使用小Demo执行任务的两种方式ThreadPoolExecutor猜想参数猜想总结图源码验证如何关闭线程池线程数量(千古难题)线程使用上的问题线程的频繁创建好销毁线程的数量过多,会造成CPU资源的开销。上下文切换 (消耗CPU资源)。线程的复用连接池、对象池、内存池、线程池 。池化技术的核心: 复用线程池提前创建一系列的线程,保存在这个线程池中。有任务要执行的时候,从线程池中取出线程来执行。没有任务的时候,线程池放回去。Excut原创 2021-07-24 17:08:34 · 135 阅读 · 0 评论 -
ThreadLocal(深入源码分析)
文章目录案例使用场景强,软,弱,虚引用(看源码会用到)内部结构设计的好处主要方法源码(一定要把内部结构看懂再看)set方法get方法remove方法内存泄漏ThreadLocal作用是让每一个线程都独有一份空间来存储自己需要的变量,这份变量对其它线程不可见!因为之前线程都是共享进程的资源嘛,如果要线程独有自己的资源就需要ThreadLocal,并且这个变量生命周期和线程生命周期一样。案例public class MyDemo { private static ThreadLocal<原创 2021-07-24 13:29:32 · 128 阅读 · 0 评论 -
J.U.C的并发工具
文章目录CountDownLatch让一个线程阻塞用法让多个线程阻塞用法实际应用(检测数据库,缓存两个服务的状态)思考底层原理Semaphore经典案例CyclicBarrierExchangerCountDownLatch就是一个计数器await阻塞线程countDown计数器减1,计数器为0时唤醒await线程让一个线程阻塞用法public class CountDownExample { static CountDownLatch countDownLatch=new Cou原创 2021-07-24 07:19:04 · 266 阅读 · 0 评论 -
并发编程之Lock锁(下)(源码分析)
文章目录Lock相关UML图公平锁和非公平锁抢占失败,加入队列并进行自旋等待unlockLock上文已经通过文字和画图大致描述了Lock的整个流程,本文就来看源码相关UML图解析,上图自然懂组合了一个Sync类的对象,在构造方法里面new的ReentrantLock默认是非公平锁如果要new公平锁,可以通过传入参数true实现Sync继承AQS,Sync其实就是干实事的,ReentrantLock的方法都是通过调用它实现锁的机制具体的非公平锁和公平锁继承抽象类Sync公平原创 2021-07-19 15:51:21 · 133 阅读 · 0 评论 -
并发编程之线程间的通信
文章目录经典消费者,生产者案例(不同于操作系统的生消案例)Wait和Notify的流程JoinCondition案例Condition设计猜想经典消费者,生产者案例(不同于操作系统的生消案例)public class Producer implements Runnable { private Queue<String> bags; private int maxSize; public Producer(Queue<String> bags, int原创 2021-07-19 13:08:25 · 114 阅读 · 0 评论 -
并发编程之Lock锁(上)
文章目录LockReentrantLockReentrantLock的设计思想总结流程图Lock它是一个接口,提供了以下的方法tryLock是返回一个布尔值,如果未抢占到锁不会阻塞,直接跳过lock是抢占锁,如果未抢到那么就阻塞,等待唤醒lockInterruptibly是可中断锁具体实现有以下用的最多的就是ReentrantLock了ReentrantLock案例public class LockDemo { static Lock lock=new ReentrantLo原创 2021-07-16 21:12:17 · 155 阅读 · 0 评论 -
Java内存模型
文章目录什么是Java内存模型(JMM)?如何屏蔽各种硬件和操作系统的差异的呢?总结什么是Java内存模型(JMM)?如图,在不同的CPU架构中,为了避免指令重排序、或者缓存一致性问题,都提供了不同的内存屏障指令。在不同的操作系统中,封装的内存屏障的实现也不相同。Java线程,如何能够在不同的硬件、不同操作系统下,仍然能够保证线程安全性呢?这就要靠JMM(Java 内存模型)Java内存模型(Java Memory Model ,JMM)就是一种屏蔽了各种硬件和操作系统的访问差异的,保证了J原创 2021-07-16 17:30:51 · 102 阅读 · 0 评论 -
并发编程之可见性(上)
文章目录可见性问题Demo为什么会产生可见性问题?CPU层面的缓存缓存一致性问题缓存锁和总线锁缓存一致性协议可见性问题Demopublic class VolatileDemo { public static boolean stop=false;//方法1是给这个变量加上Volatile关键字 public static void main(String[] args) throws InterruptedException { Thread t1=new Thread((原创 2021-07-16 10:36:42 · 78 阅读 · 0 评论 -
并发编程之可见性(下)
文章目录volatile原理指令重排序Happens-Before规则内存屏障CPU优化之路的总结volatile原理由上面的Demo效果,我们可以知道volatile解决了可见性问题,再加上可见性的原理分析和解决方法的分析,也就可以推出下图volatile关键字其实就是在汇编层面加了一个lock指令,然后lock指令最后是采用缓存锁还是总线锁来解决缓存一致性问题是由CPU自己决定的,我们不用管。指令重排序除了缓存一致性问题还有最后一个就是指令重排序的问题。即CPU,JVM层面优化指令的执行顺序原创 2021-07-16 10:35:16 · 78 阅读 · 0 评论 -
并发编程之同步锁(上)
文章目录并发编程安全三大问题Synchronized的基本应用Synchronized的原理对象头通过ClassLayout打印对象头对齐填充锁的状态并发编程安全三大问题原子性(Synchronized, AtomicXXX、Lock可以解决)涉及到共享变量访问的操作,若该操作从执行线程以外的任意线程来看是不可分割的,那么该操作就是原子操作,该操作具有原子性。即,其它线程不会“看到”该操作执行了部分的中间结果。老掉牙的代码public class Demo { int i = 0;原创 2021-07-04 19:28:08 · 120 阅读 · 0 评论 -
并发编程之同步锁(下)
文章目录锁的具体实现偏向锁demo重量级锁DemoCAS(有点类似于数据库通过version来实现乐观锁的感觉)CAS底层实现ABA问题锁的具体实现先上图再上代码验证偏向锁demopublic class LockDemo { Object o=new Object(); public static void main(String[] args) { LockDemo demo=new LockDemo(); //o这个对象,在内存中是如何存储和布局的。原创 2021-07-04 20:32:30 · 88 阅读 · 0 评论 -
并发编程入门篇(下)
文章目录java线程的状态wait和sleep的区别join和yield查看线程状态方式线程的停止interrupt方法处于阻塞状态下的线程中断java线程的状态线程的状态包括 新建状态,运行状态,阻塞等待状态和消亡状态。其中阻塞等待状态又分为BLOCKED, WAITING和TIMED_WAITING状态。源码:注意看我的注释public enum State { NEW,//这一个已经创建的线程,但是还没有调用start方法启动的线程所处的状态。原创 2021-07-04 15:55:31 · 77 阅读 · 0 评论 -
并发编程入门篇(上)
文章目录什么是并发?QPS?TPS?怎样才能实现高并发?CPU浪费现象和上下文切换线程和进程为什么要引入线程Java实现线程的方式为什么是调用start方法而不是run方法?多线程什么是并发?QPS?TPS?并发数即当前系统能够同时承载的并发数(即请求处理数 )QPS(Queries Per Second)是每秒查询率(一台服务器每秒能够响应的查询次数),即最大吞吐能力。TPS(TPS Transactions Per Second)是事务数/秒,这里的事务是指客户端向服务器发送请求然后服务器做出原创 2021-07-04 09:40:50 · 199 阅读 · 0 评论 -
Java并发三
文章目录线程池使用线程池有什么好处线程池的7个参数线程池怎么排队?比较常见的线程池类型阻塞队列ArrayBlockingQueueLinkedBlockingQueueSynchronousQueueCountDownLatchCyclicBarrierThreadLocalAtomic杂七杂八多线程知识点线程池即存放线程的池子。Client调用ThreadPoolExecutor.submit(Runnable task)提交任务,然后线程池用里面的线程来处理这个任务。线程池内部维护的工作者线程的原创 2021-06-26 09:19:40 · 88 阅读 · 0 评论 -
Java并发二
文章目录原子性可见性有序性总结三大性synchronized公平调度方式非公平调度方式两者优缺点volatileReentrantLock和synchronized原子性定义:对于涉及到共享变量访问的操作,若该操作从执行线程以外的任意线程来看是不可分割的,那么该操作就是原子操作,该操作具有原子性。即,其它线程不会“看到”该操作执行了部分的中间结果。举例:银行转账流程中,A账户减少了100元,那么B账户就会多100元,这两个动作是一个原子操作。我们不会看到A减少了100元,但是B余额保持不变的中间结果。原创 2021-06-19 18:49:43 · 82 阅读 · 0 评论 -
Java并发一
文章目录并发编程必须会的知识点进程和线程的区别进程之间的通信方式(操作系统层面)单线程和多线程的关系线程的状态有哪几种?并发编程中常用的API线程会遇到哪些故障?死锁线程锁死信号丢失锁死嵌套监视器锁死活锁线程饥饿并发编程必须会的知识点单线程和多线程,进程与线程的区别线程活性故障及其解决方法线程调度方式可见性,原子性以及有序性synchronized,volatile,Atomic等关键字线程池及阻塞队列java.util.concurrent(简称JUC )包,此包是并发编程中常用的工具原创 2021-06-19 18:20:51 · 208 阅读 · 0 评论