
多线程
文章平均质量分 51
迪恩_Emma
喜欢看书的Java开发
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
创建线程池的方法?
线程池的三个常用创建方式:1)newFixedThreadPool() 一池固定多少个线程2)new SingleThreadExecutor() 一池一个线程3)newCachedThreadPool() 一池N个处理线程(N由系统决定)但是在实际开发中不能用以上的三种,要用自定义的线程池,原因是:(阿里巴巴Java开发手册中写到)自定义的线程池:...原创 2021-05-05 21:54:18 · 134 阅读 · 0 评论 -
线程池的创建过程
当调用execute()方法添加一个任务时,线程池会判断:1)如果正在运行的线程数量小于corePoolSize,就马上创建线程执行这个任务2)如果正在运行的线程数量大于等于corePoolSize,就将这个任务放入阻塞队列中3)如果这时阻塞队列满了,而且正在运行的线程数量小于maximumPoolSIze,也马上创建线程执行这个任务4)如果阻塞队列满了,正在允许的线程数量大于等于maximumPoolSize,就会执行拒绝策略5)当一个线程完成任务,就会从阻塞队列中取出下一个任务来执行原创 2021-05-05 21:48:11 · 593 阅读 · 0 评论 -
线程池的七大参数
1)corePoolSize 线程池中的常驻核心线程数2)maximumPookSize 线程池能同时执行的最大线程数3)keepAliveTime 多余空闲线程的存活时间当线程数量超过corePoolSize时,当空闲时间达到keepAliveTime值时,多余空闲线程会被销毁直到剩下corePoolSize个线程为止4)unit 多余线程的存活时间keepAliveTime的单位5)workQueue 阻塞队列6)threadFactory 创建线程的工厂7)handle..原创 2021-05-05 21:43:00 · 247 阅读 · 0 评论 -
start()和run()的区别
首先讲讲线程实现的2中方式:1)继承Thread类2)实现Runnable接口推荐第二种方式。因为实现接口的方式可以实现多继承Thread直接调用start()方法Thread Test = new Thread();Test.start();Runnable要先new一个Runnable对象,把Runnable对象放到Thread里,再调用start()Test impelements Runnable;Test t = new Test();Thread.原创 2021-05-05 21:23:42 · 118 阅读 · 0 评论 -
线程状态
1.初始状态new一个实例时,线程就进入了初始状态2.就绪状态(可运行状态)1)调用start()方法,就进入了可运行状态2)sleep()方法结束3)等待用户输入完毕4)锁池里的线程拿到对象5)线程时间片用完了6)其他线程join()方法调用结束3.运行状态线程调度从运行池中选择一个线程。这是线程进入运行状态的唯一方式只有就绪状态和运行状态可以互相转换4.阻塞状态失去处理器资源(除了失去CPU时间片)1)线程调用sleep()...原创 2021-05-05 21:06:28 · 106 阅读 · 0 评论 -
java有哪些锁?
公平锁和非公平锁:公平锁:获取锁的顺序按照申请的顺序,先来后到非公平锁:获取锁的顺序不是按照申请锁的顺序,后申请的可能比先申请的先获得锁,可能会造成优先级反转或饥饿现象可重入锁:线程可以进入与它持有同一把锁的代码块ReentrantLock、Synchronized就是典型的可重入锁可重入锁的作用:避免死锁public sync void method01(){ method02();}public sync void method02()...原创 2021-05-05 20:38:41 · 81 阅读 · 0 评论 -
Synchronized和lock的区别
Synchronized和lock的区别1)来源:lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;2)异常是否释放锁:synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)3)是否响应中...原创 2021-05-04 23:01:10 · 102 阅读 · 0 评论 -
JDK1.8怎么解决HashMap死循环的问题?
JDK1.8之前出现死循环的原因:HashMap在多线程环境下,同时进行put操作,并且同时进行扩容时,会出现链表环,导致死循环JDK1.8解决之前版本出现的死循环:jdk1.8后是直接把节点放到扩容后该链表的尾节点,而jdk1.8前是直接放到头节点其实JDK1.8也会出现死循环,只是原因不同:i)链表转换为数ii)对树进行操作时...原创 2021-05-04 22:38:32 · 3214 阅读 · 0 评论 -
ConcurrentHashMap的底层结构,jdk1.8有了什么区别?
HashMap在多线程环境下操作不安全,在java.util.concurrent包下,提供了ConcurrentHashMap类,保证了HashMap操作安全不推荐使用Hashtable:它相当于给整个哈希表加了一把大锁,只要有一个线程访问,其他线程只能阻塞等待,并发性很差Collections.synchronizedMap也不够好,它本质也是对HashMap进行全表锁,并发性也不好JDK1.7的ConcurrentHashMap 采用了分段锁策略,将一个 HashMap..原创 2021-05-04 21:23:00 · 337 阅读 · 0 评论 -
四大引用类型
强引用(默认是该引用StrongReference)是最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还活着,垃圾收集器不会碰这种对象,即使该对象以后永远都不会被用到JVM也不会回收因此强引用是造成Java内存泄漏的主要原因之一若将强引用显式地将引用赋值为null或超过了引用的作用域,就可以被垃圾收集了代码Demopublic class StrongReferenceDemo{ public static void main(String[] args){ ...原创 2021-04-20 21:36:04 · 365 阅读 · 0 评论 -
对AQS的理解
三种让线程等待和唤醒的方法1)使用Object中的wait()方法让线程等待,使用`Object`中的`notify()`方法唤醒线程2)使用`JUC`包中`Condition`的`await()`方法让线程等待,使用`signal()`方法唤醒线程3)`LockSupport`类可以阻塞当前线程以及唤醒指定被阻塞的线程(`park()`和`unpark()`)传统的synchronized和Lock实现等待唤醒通知的约束代码Demostatic Object objec.原创 2021-04-08 12:18:08 · 205 阅读 · 0 评论 -
集合类不安全的问题
并发修改异常(ArrayList)ArrayList不安全原因:是由于高并发下add方法没有加锁,该方法不安全引发:java.util.ConcurrentModificationException 高并发修改异常代码Demopublic class ContainerNotSafeDemo{ public static void main(Stirng[] args){ List<String> list=new ArrayList<...原创 2021-03-22 10:53:47 · 99 阅读 · 0 评论 -
ABA问题
CAS会导致"ABA"问题CAS算法实现时会取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个事件差内会导致数据的变化。例如:1.线程1从内存中取出A,这时线程2也从内存中取出A2.内存2进行了一些操作将值变成了B,然后线程2又将内存的数据变成A3.这时线程1进行CAS操作发现内存中仍然是A,然后线程1操作成功尽管线程1的CAS操作成功,但不代表这个过程是没有问题的ABA问题的产生原因?原子引用:AtomicReference<V>(V代表泛型,可以自.原创 2021-03-22 10:43:49 · 193 阅读 · 0 评论 -
对volatile的理解
JMM——Java内存模型(Java Memory Model)本身是一种抽象的概念,不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量的访问方式JMM关于同步的规定:1)线程解锁前,必须把共享变量的值刷新回主内存2)线程加锁前,必须读取主内存的最新值到自己的工作内存3)加锁解锁是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(或称为栈空间),工作内存是每个线程的私有数据区域。而Java内存模型中规定所有变量..原创 2021-03-22 10:20:40 · 187 阅读 · 0 评论 -
对CAS的理解
什么是CAS?比较并交换(compare and set)public class CASDemo{ public static void main(String[] args){ AtomicInteger atomicInteger=new AtomicInteger(5); boolean flag1=atomicInteger.compareAndSet(5,2019); //result==2019 int result1=atomicInteger.get();原创 2021-03-22 10:32:17 · 629 阅读 · 0 评论